如何在Asp.Net中使用Load Balancer进行会话管理

时间:2012-03-12 12:47:21

标签: asp.net session session-state load-balancing

我有四个不同的服务器和一个负载均衡器。我想使用验证码控制。我用这种方式做了一些事情:

我创建了一个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"/>

但它仍然无效。

我该怎么办?

3 个答案:

答案 0 :(得分:4)

首先(只是为了确保) - 我相信这个连接字符串只是一个例子,因为127.0.0.1是localhost,它没有机会工作;)。

现在我将假设您为状态服务器选择了服务器A.请检查以下事项:

  • “ASP.NET状态服务”在服务器A上启动并运行(默认情况下已禁用,您可以在管理工具中检查 - >服务)
  • 服务器B,C和D中的stateConnectionString为“tcpip = [服务器A IP地址或网络名称]:42424”(仅在服务器A上为127.0.0.1)
  • 服务器可以通过端口42424(防火墙等)使用TCP / IP进行相互通信。

请记住,如果您已将服务器A上的“ASP.NET状态服务”的配置更改为不使用默认端口(42424),则必须在连接字符串中反映出来。

有时配置“SQL Server模式”而不是“状态服务器模式”更容易,因此您可能需要考虑这一点。您可以找到更多详细信息here

答案 1 :(得分:1)

您需要使用StateServer或SqlServer来管理会话状态,它们应该位于用于平衡负载的防火墙网络之外。

http://www.hanselman.com/blog/LoadBalancingAndASPNET.aspx

答案 2 :(得分:0)

使用会话状态服务器时,很少需要设置。

  1. 在您想要作为StateServer的计算机上设置ASP.Net State Service。

      

    net start aspstate

  2. 在所有Web应用程序的Web.Config文件中更改会话模式并指向StateServer

  3. <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])