【问题标题】:How to use session management with Load Balancer in Asp.Net如何在 Asp.Net 中将会话管理与负载均衡器一起使用
【发布时间】:2012-03-12 12:47:21
【问题描述】:

我有四个不同的服务器和一个负载平衡器。我想使用验证码控制。我是这样处理的:

我创建了一个 handler.ashx 来创建验证码图像。此处理程序用于主页。在创建验证码控件时,我将验证码控件密码保留在会话中。然后我将用户输入的密码与会话中的密码进行了比较。它工作得很好,但只在一台服务器上。

四台服务器无法正常运行。尽管用户每次都输入正确的密码,但有时与会话密码匹配,有时不匹配。我认为问题的原因是这样的:

例如:

A、B、C 和 D 是四台服务器。负载均衡器将第一个请求路由到 A 服务器。从 A 服务器打开主页并创建密码“123456”。这存储在 A 服务器上的会话中。然后用户输入密码并单击按钮。现在负载均衡器将此请求路由到 B 服务器。因为 B Sever 中的 session 为空,所以密码不匹配。

我的 web.config 有这个,

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"/>

但是还是不行。

我该怎么办?

【问题讨论】:

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


    【解决方案1】:

    所以第一件事(只是为了确保) - 我相信这个连接字符串只是一个例子,因为 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 模式”比“State Server 模式”更容易,因此您可能需要考虑这一点。您可以找到更多详细信息here

    【讨论】:

    • 我试过了。但它仍然不起作用。服务器IP:192.168.50.51。 B服务器IP:192.168.50.52。 Webconfig 中的服务器 tcpip = 127.0.0.1:42424。 B 服务器 tcpip = 192.168.50.51:42424 在 webconfig 中。我启动了 asp.net 服务。我有一个错误。 postimage.org/image/5u6rjoknr 。然后我更改了这个值“HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnections”。我设置为“1”。但是还是不行。
    • 错误信息是说B服务器无法连接到A服务器。可能存在许多网络问题。您是否检查过此端口上从 B 到 A 的通信是否可行?您是否还更改了 A 或 B 上的此设置?当您尝试直接登录 A 时是否出现错误消息?
    • A和B之间的所有端口都是开放的。我不更改端口设置。他们使用“42424”。 A 正在工作。但是B不工作。 B 给出了错误。
    • 所以这肯定证明B和A之间存在通信问题。服务器B无法连接到A上的状态服务器,一定是网络问题。您可能需要联系您的网络管理员来帮助您解决问题。
    • 首先感谢您的关注。问题已解决。这不是网络问题。问题原因是 IIS 上的服务器状态配置。 IIS 上服务器状态设置的连接字符串是 'tcpip=localhost:42424' 。我将其更改为“tcpip=192.168.50.51:42424”。它有效。
    【解决方案2】:

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

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

    【讨论】:

    • 为此 +1。您必须在机器之间共享会话状态。这样做的唯一方法是将机器设置为“状态”服务器。这可能意味着将其存储在您的 sql 数据库服务器或其他专用服务器中。无论哪种方式,它都必须位于所有 Web 服务器都可以访问的地方。
    【解决方案3】:

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

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

      net start aspstate

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

    <system.web>
        <!-- ... -->
        <sessionState
            mode="StateServer"
            stateConnectionString="tcpip=your_server_ip:42424"
            cookieless="false"
            timeout="20" />
        <!-- ... -->
    </system.web>
    

    3 .所有 Web Server 使用相同的&lt;machinekey&gt; 配置

    <machineKey 
      validationKey="1234567890123456789012345678901234567890AAAAAAAAAA"
      decryptionKey="123456789012345678901234567890123456789012345678"
      validation="SHA1"
      decryption="Auto"
    />
    

    (Note:要在 Web 场中的不同 Web 服务器之间保持会话状态,Microsoft Internet 信息服务 (IIS) 元数据库中网站的应用程序路径(例如 \LM\W3SVC\2)必须Web 场中的所有 Web 服务器都必须相同。大小写也需要相同,因为应用程序路径区分大小写。 [http://support.microsoft.com/kb/325056])

    【讨论】:

    • 我有 machineKey。的。虽然它仍然给出错误。
    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2014-05-08
    • 2022-01-01
    • 1970-01-01
    • 2017-08-13
    • 2017-04-24
    相关资源
    最近更新 更多