使用ASP.NET / SQL Server丢失会话状态

时间:2012-05-11 16:12:56

标签: asp.net asp.net-mvc machinekey sql-session-state

我将ASP.NET MVC工作流配置为由负载均衡器管理的两个网站。这些网站使用Sql Server作为会话状态提供程序,并关闭身份验证(不需要)。

现在,偶尔我似乎正在失去会话状态,我相信这是因为请求由备用服务器处理,所以用户基本上是从服务器跳到服务器,这取决于负载均衡器看起来如何适合。我并不总是"失去会话状态"在工作流程的同一阶段,所以我认为它与Web场配置+ sql server会话状态有关。

两个应用程序使用相同的机器密钥来加密和解密存储在sql server中的会话状态。

两台服务器上的配置如下:

<authentication mode="None" />
<sessionState mode="SQLServer" sqlConnectionString="{connection-string}" />
<machineKey decryptionKey="777CB456774AF02F7F1AC8570FAF31545B156354D9E2DAAD" 
            validationKey="89B5B536D5D17B8FE6A53CBB3CA8B8695289BA3DF0B1370BC47D362D375CF91525DDB5307D8A288230DCD4B3931D23AED4E223955C45CFF2AF66BCC422EC7ECD" />

我已经确认这两台服务器上的相同,是否有我遗漏的东西?

当我使用单个服务器时,在我的开发环境中不会发生这种情况。

我担心我会受到星期五蓝调的影响,毫无疑问会在下周找出答案,遗憾的是我不想等待!

有什么想法吗?

3 个答案:

答案 0 :(得分:28)

发现了这个问题。

当您创建希望使用Sql Server共享会话状态的应用程序时,它们需要在IIS中配置相同的ID。这是因为生成的会话ID是基于应用程序ID生成的。 (内部应用程序ID类似于 LM / W3SVC / 1

两台服务器对IIS中的每个应用程序都有不同的ID。决议是更改“管理网站 - &gt;下的ID”。每台服务器上的“高级设置”。

enter image description here

答案 1 :(得分:8)

  1. 使用IIS管理器,在根级别和网站级别仔细检查您的计算机密钥设置。
  2. enter image description here

    1. 查看计算机密钥元素上的IsolateApps修饰符 - http://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.100%29.aspx

    2. 您最近是否从3.5升级到4.0?

    3. 最后的手段 - 在两台计算机上回收appPools,然后重新启动IIS。

答案 2 :(得分:6)

会话具有(网络)应用范围。看看this MS KB是否有帮助。

更新: 有趣的投票。也许我的建议需要更清晰。

添加到匹配的计算机密钥时,必须匹配网站的IIS配置(因此它是“相同的应用程序”(应用程序路径)< / em>在IIS中。