1

我有一个在 Windows 2008 R2 (IIS 7.5) 上运行的 Asp.Net Web 应用程序。我有两台服务器 WWW1 和 WWW2,DNS 记录是为“www”的循环 DNS 设置的。我增加了 AppPool 超时和会话状态超时设置,这样用户就不会在 20 分钟后退出。但是我注意到用户正在随机注销。我认为正在发生的事情是用户访问 www.foo.com 并登录,然后一段时间后循环将他们导航到集群中的对面服务器(WWW1 或 WWW2),其中未创建 cookie,因此提示他们登录。

我怎样才能让它工作并仍然使用循环 DNS 保持我的高可用性解决方案?

4

1 回答 1

7

这里的问题是每台服务器都在内存中维护自己的会话状态,并且不知道在另一台服务器上创建的会话。

为了解决这个问题,您需要使用 StateServer 或 SQLServer 会话状态提供程序,而不是使用默认的 InProc 会话状态提供程序。

为此,您需要确保 ASP.NET 状态服务正在您的一台服务器上运行,然后您需要将以下配置项添加到应用程序的 web.config 文件的 system.web 部分,替换'SampleStateServer' 与您正在运行 ASP.NET 状态服务的服务器的名称:

    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false"
      timeout="20"/>

Microsoft 的相关文档可在http://msdn.microsoft.com/en-us/library/ms178586.aspx获得

因为您在 Web 场中运行它,您还需要确保两台服务器上的 Web 应用程序使用相同的加密密钥。

为此,您需要在 web.config 中设置一个 machineKey 条目,其中涉及将如下条目添加到 web.config 的 system.web 部分:

<machineKey validationKey="4D0590A0E4DE163BAD0EEEB6747467D770CD5FB2EA95BF02B27787A45CA579DECB01E2A1F16563DBAB44C1C0E54C7E53D65F2A7D0FDF378F4D3702B3F2C8B165" decryptionKey="928771D7B1B8C32608F56AC428EC5902985F6FB2E6E9A78733B6EAA493FA13F5" validation="SHA1" decryption="AES" />

有几个网站会为您生成密钥。我通常使用http://aspnetresources.com/tools/machineKey

如果您想改用 SQLState 提供程序, http: //msdn.microsoft.com/en-us/library/ms178586.aspx在页面的“Sql Server 模式”部分下提供了所有配置信息。由于您必须配置一个用于存储状态的数据库,因此设置会稍微复杂一些。

于 2013-01-23T06:03:04.457 回答