19

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

现在,我似乎偶尔会丢失会话状态,我相信这是因为请求正在由备用服务器处理,所以基本上用户正在从服务器跳转到服务器,这取决于负载均衡器认为合适的方式。我并不总是在工作流的同一阶段“丢失会话状态”,所以我相信这与网络场配置 + sql server 会话状态有关。

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

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

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

我已经确认这在两台服务器上都是相同的,有什么我遗漏的吗?

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

我担心我正遭受周五忧郁症的折磨,毫无疑问下周会找出答案,可悲的是我不想等待!

有任何想法吗?

4

3 回答 3

29

发现问题。

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

两台服务器对 IIS 中的每个应用程序都有不同的 ID。解决方法是在每台服务器的“管理网站 -> 高级设置”下更改 ID。

在此处输入图像描述

于 2012-05-14T12:59:32.460 回答
8
  1. 使用 IIS 管理器,在根级别和网站级别仔细检查您的计算机密钥设置。

在此处输入图像描述

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

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

  3. 不得已 - 回收两台机器上的 appPools,然后重新启动 IIS。

于 2012-05-11T17:22:50.387 回答
6

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

更新:有趣的反对票。也许我的建议需要更加明确。

除了匹配机器密钥外,您必须匹配站点的 IIS 配置(因此它是 IIS 中的“相同应用程序”(应用程序路径)

于 2012-05-11T18:14:28.770 回答