使用Azure网站的Azure缓存服务(预览)时出现问题

时间:2014-04-01 00:19:35

标签: asp.net session azure azure-web-sites azure-caching

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

为了解决问题的根源,我现在已经创建了2个测试站点并将其上载到Azure上。我更改了配置以使用缓存服务(预览)作为SessionState但它仍然无法正常工作。

访问测试网站的链接是:http://sessiontestsite1.azurewebsites.net/

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

我按照此link配置了缓存服务。

我在某处读过,有人说Cache Service不能用于Azure网站,但我认为这些是旧帖子,根据Scott Gutherie的博客(对不起,StackOverflow不允许我发布更多内容)缓存服务可以与Azure网站一起使用。

我们还要求将这些网站用作Azure网站,我们不希望使用WebRoles或VM或CloudServices等。

2 个答案:

答案 0 :(得分:0)

这不是会话的工作方式。 当您在会话中放置一个值时,服务器会为客户端分配一个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. 以会话状态存储内容
  7. 登录kudu(https://<yoursitename>.scm.azurewebsites.net
  8. 转到进程资源管理器视图(https://<yoursitename>.scm.azurewebsites.net/ProcessExplorer)并右键单击w3wp.exe并将其终止(您还可以在那里验证PID)
  9. 再次从浏览器发送请求,它将转到另一个实例,您可以通过Process Id告诉,但会话值仍会保存。

答案 1 :(得分:0)

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

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