我有四个不同的服务器和一个负载均衡器。我想使用验证码控制。我用这种方式做了一些事情:
我创建了一个handler.ashx来创建验证码图像。此处理程序在主页面中使用。我在创建验证码控件时将验证码控制密码保留在会话中。然后我将用户键入的密码与会话中的密码进行比较。它工作得很好,但只能在一台服务器上运行。
四台服务器无法正常运行。虽然用户每次都输入正确的密码,但有时会与会话密码匹配,有时也不匹配。我认为问题的原因是:
例如:
A,B,C和D是四台服务器。负载均衡器将第一个请求路由到A服务器。这将从A服务器打开主页并创建密码“123456”。它存储在A服务器上的会话中。然后用户输入密码并单击按钮。现在负载均衡器将此请求路由到B服务器。由于B Sever中的会话为空,因此密码不匹配。
我的web.config有这个,
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"/>
但它仍然无效。
我该怎么办?
答案 0 :(得分:4)
首先(只是为了确保) - 我相信这个连接字符串只是一个例子,因为127.0.0.1是localhost,它没有机会工作;)。
现在我将假设您为状态服务器选择了服务器A.请检查以下事项:
请记住,如果您已将服务器A上的“ASP.NET状态服务”的配置更改为不使用默认端口(42424),则必须在连接字符串中反映出来。
有时配置“SQL Server模式”而不是“状态服务器模式”更容易,因此您可能需要考虑这一点。您可以找到更多详细信息here。
答案 1 :(得分:1)
您需要使用StateServer或SqlServer来管理会话状态,它们应该位于用于平衡负载的防火墙网络之外。
答案 2 :(得分:0)
使用会话状态服务器时,很少需要设置。
在您想要作为StateServer的计算机上设置ASP.Net State Service。
net start aspstate
在所有Web应用程序的Web.Config文件中更改会话模式并指向StateServer
<system.web> <!-- ... --> <sessionState mode="StateServer" stateConnectionString="tcpip=your_server_ip:42424" cookieless="false" timeout="20" /> <!-- ... --> </system.web>
3。所有Web服务器使用相同的<machinekey>
配置
<machineKey validationKey="1234567890123456789012345678901234567890AAAAAAAAAA" decryptionKey="123456789012345678901234567890123456789012345678" validation="SHA1" decryption="Auto" />
(Note:要维护Web场中不同Web服务器的会话状态,Microsoft Internet信息服务(IIS)中的Web站点的应用程序路径(例如,\ LM \ W3SVC \ 2)对于Web场中的所有Web服务器,配置数据库必须相同。这种情况也需要相同,因为应用程序路径区分大小写。 [http://support.microsoft.com/kb/325056])