我有一个在Windows2008 R2 (IIS7.5)上运行的Asp.Net web应用程序。我有两个服务器WWW1和WWW2,并且为"www“的循环DNS设置了DNS记录。我增加了AppPool超时和会话状态超时设置,这样用户在20分钟后就不会被注销。然而,我注意到用户是随机注销的。我认为发生的情况是用户转到www.foo.com并登录,然后一段时间后,循环调度会将他们导航到集群中未创建cookie的相对服务器(WWW1或WWW2),因此会提示他们登录。
我如何使用轮询DNS使其正常工作,同时仍然保持高可用性解决方案?
发布于 2013-01-23 14:03:04
这里的问题是,每个服务器都在内存中维护自己的会话状态,并且不知道在另一个服务器上创建的会话。
为了解决这个问题,您需要使用StateServer或SQLServer会话状态提供程序,而不是使用默认的InProc会话状态提供程序。
为此,您需要确保ASP.NET状态服务正在您的一台服务器上运行,然后您需要将以下配置项添加到应用程序的web.config文件的system.web部分,将“SampleStateServer”替换为运行ASP.NET状态服务的服务器的名称:
<sessionState mode="StateServer"
stateConnectionString="tcpip=SampleStateServer:42424"
cookieless="false"
timeout="20"/>微软的相关文档可在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模式”部分下提供了所有配置信息。这方面的设置稍微复杂一些,因为您必须配置一个存储状态的数据库。
https://stackoverflow.com/questions/14473050
复制相似问题