在IIS Web Farm中共享会话

时间:2014-04-23 11:43:47

标签: session iis asp-classic windows-server-2008-r2

我们在Web场环境中安装了带有IIS的Windows Server 2008 R2。我发起了一个经典的ASP会话,并且经常在刷新页面时,它没有显示,但后来再次回来。

我转到http://mainurl.com,但有两个名为http://devbox1.comhttp://devbox2.com

的框

我把这些文件放在一个DEV盒子上,然后复制到另一个盒子里。

一些阅读之后,我想这可归结为跨Web场实例共享会话的“常见”问题。

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

  

<强>更新

     

由于我的帖子中不清楚。 使用Session.SessionID作为Cookie的标识符,因为这会在不同环境中发生变化(Microsoft recommend永远不会将SessionID存储在数据库中。

     
    

引自MSDN Library - Session.SessionID

         

您不应使用SessionID属性为数据库应用程序生成主键值。这是因为如果重新启动Web服务器,则某些SessionID值可能与服务器停止之前生成的值相同。相反,您应该使用自动增量列数据类型,例如IDENTITY与Microsoft®SQLServer™或COUNTER与Microsoft Access。

  
     

而是使用自己生成的id值,然后将其存储在cookie和数据库中。这样就可以重新创建Session对象。


似乎有一些关于使用数据库的解决方案的讨论。只是为了澄清Classic ASP使用存储在内存中的Session对象,这意味着你切换机器负载均衡的时刻,否则你仍然会丢失会话。

有关此主题的IIS.net论坛上有趣的文章 - iis 7 Load balancing

  

来自Bill Staples的报价(当时他是IIS的产品部经理)

     

然而,要考虑的一件事是如何处理任何应用程序/会话状态。经典ASP将会话状态存储在内存中,只有一个进程可以访问。只要将站点扩展到多台计算机上,就无法再保证特定用户会话的每个传入请求都登陆到同一台计算机上,这意味着客户端可能会在请求之间突然“失去状态”。这就是为什么我们建议您不要在ASP中使用内置会话支持来实现这些场景。相反,我们建议您使用SQL或其他数据库来存储此类数据。

我的建议是将Session存储在数据库中,在客户端计算机上创建cookie,然后使用此cookie从数据库中识别会话。

Cookie可以更改,因此我仍然建议您在SSL安全网站上使用secure Cookie,尤其是在数据具有敏感性的情况下。

答案 1 :(得分:-2)

您应该在使用Web场时创建粘性会话,因为很可能您有负载平衡系统,在标准配置下,它会将流量指向最低负载节点。因此,您的用户将不时地松开会话。

让您的网络管理团队了解如何为您的特定负载均衡器和网络配置创建粘性会话,他们应该确切地知道这意味着什么。这是其中一个示例,以及如何配置它:{{3 }}。但这又取决于你正在使用的是什么。

带有cookie或数据库条目的****解决方案不是处理这种情况的最佳方法,因为再次依赖于您的Web场配置IIS可以简单地拒绝任何覆盖您存储在数据库中的会话ID的尝试,或者如果安全性是在连接到其他节点时甚至拒绝连接到页面。