【问题标题】:Trouble using Azure Cache Service (Preview) with Azure Website在 Azure 网站上使用 Azure 缓存服务(预览版)时遇到问题
【发布时间】:2014-04-01 00:19:35
【问题描述】:

我们目前在我们的一台服务器上托管了 2 个独立的 ASP.Net 网站。这些站点使用 StateServer 在两个站点之间维护相同的会话。我们希望将这些站点迁移到 Azure。我能够毫无问题地在 Azure 上上传这两个站点,但我无法在两个站点之间共享会话。我尝试使用 Azure 缓存服务(预览版)来维护会话,但由于某种原因它不起作用,当我重定向到第二个站点时它总是使用不同的会话。我已经花了很多时间在谷歌上搜索,但无济于事。

为了深入了解问题,我现在创建了 2 个测试站点并将其上传到 Azure。我更改了配置以使用缓存服务(预览版)作为 SessionState,但它仍然不起作用。

测试站点的链接是:http://sessiontestsite1.azurewebsites.net/

在主页上,请在文本框中输入一个值,然后单击“更新会话变量”,这会将文本存储到会话变量中。然后,在页面的右上角有一个名为“Site2”的链接,它将重定向到第二个站点。我希望第二个站点能够访问“Site1”中设置的会话变量,反之亦然。请注意,在我的本地机器上,我可以使用 StateServer 使用相同的会话。

我按照这个link配置缓存服务。

我在某处读到,人们说缓存服务不能与 Azure 网站一起使用,但我认为这些都是旧帖子,根据 Scott Gutherie 的博客(抱歉,StackOverflow 不允许我发布超过 2 个链接)缓存服务可用于 Azure 网站。

此外,我们的要求是将这些站点用作 Azure 网站,我们不想使用 WebRoles 或 VM 或 CloudServices 等。

【问题讨论】:

  • 请检查您是否在 web.config 中指定了会话状态提供程序部分。安装 NuGet 包后,它将更新 web.config 并添加配置了 azure 缓存服务的会话状态提供程序,但默认情况下会对其进行注释。您可能需要取消注释并再试一次。
  • sessionState 部分没有被注释掉。谢谢。

标签: asp.net session azure azure-web-app-service azure-caching


【解决方案1】:

这不是会话的工作方式。 当您在 Session 中输入值时,服务器会为客户端分配一个 ID,并将其以 cookie 的形式发送给客户端。在 ASP.NET 中,它是 ASP.NET_SessionId。客户端(浏览器)只会将 cookie 发送到与其关联的远程地址。如果您使用 Fiddler 或浏览器开发工具,您将看到浏览器将 ASP.NET_SessionId cookie 发送回 sessionstatesite1 而不是 sessionstatesite2,因为它具有不同的主机名。

您可以手动添加 cookie(例如使用浏览器开发工具)并再次测试。

如果您想将缓存用于用户会话并让用户使用 1 个路由到不同 Azure 网站实例的 URL 访问该站点,那么该缓存将适合您。同样,您可以使用多种方式验证这一点。在上面手动添加 cookie 应该会告诉您它正在工作。如果您想在端到端流程中执行此操作:

  1. 创建 Azure 网站
  2. 扩展网站以在多个实例上运行
  3. 将您的站点配置为显示 Process IdInstance Id 环境变量
  4. 将您的网站配置为像以前一样使用缓存
  5. 在会话状态中存储一些东西
  6. 登录 kudu (https://<yoursitename>.scm.azurewebsites.net)
  7. 转到进程资源管理器视图 (https://<yoursitename>.scm.azurewebsites.net/ProcessExplorer) 并右键单击 w3wp.exe 并杀死它(您也可以在那里验证 PID)
  8. 再次从浏览器发送请求,它将转到另一个实例,您可以通过Process Id 判断,但会话值仍会被保存。

【讨论】:

  • 这让我对会话的理解更加清晰,谢谢。您的建议可能适用于同一网站的多个实例。但是我怎样才能为 2 个不同的网站实现这一目标?目前我们使用 StateServer,share the session 有一些代码。如何在 Azure 中实现同样的目标?
  • 如果您的 2 个站点将在子域上运行,那么您可以将 cookie 中的域字段更新为根域,浏览器会将其发送到两个站点(顺便说一句,这就是链接中的代码你有)。例如,如果您在示例中将域更新为azurewebsites.net,它将起作用。但是不要这样做,因为这会将您的站点 cookie 发送到在 azure 上运行的所有站点,而您不希望这样。相同的概念适用于 azure 缓存。如果您只想在进程之间共享对象和值,可以使用azure cache APIs to achieve that
  • 这就是我想要对我的测试站点做的事情。 SessionTestSite1SessionTestSite2 都使用相同的 azure 缓存服务端点。
  • 但据我了解,您将值存储在 Session 对象中,对吧? Session 对象需要 Session Cookie。 DataCache 另一方面,对象没有。
  • 是的,你是对的。我将值存储在 Session 对象中。
【解决方案2】:

由于当前设置中的会话共享不起作用,我们决定使用两个站点作为虚拟应用程序。

我们现在创建了一个新网站,该网站有两个子文件夹(设置为虚拟应用程序)。这两个站点现在都位于这些子文件夹中。这样使用缓存服务的会话状态就可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2018-09-15
    • 2018-08-17
    相关资源
    最近更新 更多