Session IIS Web场中的共享会话

Session IIS Web场中的共享会话,session,iis,asp-classic,windows-server-2008-r2,Session,Iis,Asp Classic,Windows Server 2008 R2,我们在web场环境中安装了带IIS的Windows Server 2008 R2。我启动了一个经典的ASP会话,每次刷新页面时,它都不会显示,但会再次显示 我去了,但有两个盒子叫 我把文件放在其中一个DEV框中,然后复制到另一个DEV框中 阅读了一些文章后,我想这是一个“常见”的问题,即跨web服务器场实例共享会话 有人能帮我解决这个问题吗?您应该在使用web场时创建粘性会话,因为您很可能有负载平衡系统,在标准配置下,该系统将流量指向负载最低的节点。因此,您的用户将不时地失去会话 请您的网络管理

我们在web场环境中安装了带IIS的Windows Server 2008 R2。我启动了一个经典的ASP会话,每次刷新页面时,它都不会显示,但会再次显示

我去了,但有两个盒子叫

我把文件放在其中一个DEV框中,然后复制到另一个DEV框中

阅读了一些文章后,我想这是一个“常见”的问题,即跨web服务器场实例共享会话


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

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

请您的网络管理员团队了解如何为您的特定负载平衡器和网络配置创建粘性会话,他们应该确切知道这意味着什么。下面是一个示例,说明了这是什么以及如何配置它:。但这又一次取决于你在使用什么

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

更新:

因为我的帖子里不清楚。请勿使用
Session.SessionID
作为cookie的标识符,因为这会随着环境的变化而变化(切勿将
SessionID
存储在数据库中)

引用自

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

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


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

IIS.net论坛上关于此主题的有趣文章-

引用Bill Staples(当时是IIS产品部门经理)

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

我的建议是将会话存储在数据库中,在客户机上创建一个cookie,然后使用此cookie从数据库中标识会话


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

将会话存储到数据库中,并使用该数据库构建会话。如果我在devbox1.com上创建一个会话并用该会话填充数据库,然后跳到devbox2.com上会怎么样?我会在首次创建会话时存储一个带有数据库会话id的cookie,然后检查该会话并返回会话将相应地从数据库中删除。客户端然后连接到哪个框并不重要。好的,谢谢-我用了一种稍微不同的方式完成了它,这似乎很有效,但感谢推送到DB解决方案谢谢@Lankymart-就可以了。据我所知,这实际上是更安全的设置。他们实际上需要同时使用有问题的计算机才能入侵。根本不需要@AlekseyF。如果有更好的解决方案,我完全赞成,我只会在人们出于怨恨而尽全力否决我或只是想表现得孩子气(你是我的朋友吗?)。IIS环境中是否支持粘性会话?只要您不在代码中的任何位置尝试强制
会话。SessionID
,我不确定这将如何发生。存储在数据库中的id应该是完全不相关的,然后在检查cookie和重新实例化会话时,您只需根据数据库值创建一个新会话。我希望先创建一个服务器,然后再创建另一个,然后返回主服务器。然后在途中收集会话并填充到DBThank中-可能是星期一和过度思考的组合,但我仍然被卡住了。假设我来到一个服务器并登录到我的系统——这发生在WEB1上。然后页面将我扔进管理员会话,但这将我扔进了WEB2。如果我在WEB1上创建一个GUID并将其存储在cookie和DB中,那么什么能阻止某人窃取该cookie并冒充该用户呢?该网站都是基于SSL的。@Pee2请注意你所说的内容,老实说,阻止有人劫持cookie的唯一方法是SSL。我还建议使用来阻止您的cookie通过HTTP被劫持。因此类似于
Response.Cookies(“lastname”).Secure=True
@pee2pee确切地说,这里有一篇关于这个主题的好文章-。