Nic*_*ber 6 c# iis asp.net-mvc load-balancing
我有一个非常有趣但令人沮丧的问题.我有一个运行标准ASP.NET身份验证的MVC 4站点.
在Windows 8上的IE 10组合中,当我遍历我的站点并从https url(同一站点上)导航到http url时,它生成一个不同的asp.net_sessionid值.在我尝试的其他所有浏览器/操作系统组合中,这似乎不是问题.
我搜索过高低,虽然我发现人们遇到了各种身份验证问题(通常是关于IIS7没有将IE10识别为浏览器),但我没有发现其他人声称遇到过这个问题.更多的是,我发布了一个"开箱即用"的MVC模板项目,它有同样的问题.我不可能是遇到这个问题的唯一一个人(我希望如此).
其他人遇到这个?或者甚至只是提出一些建议?
谢谢
UPDATE
好的,还有一个更重要的方面.我在负载均衡的环境中运行它.如果我将应用程序推送到单个服务器并进行测试,我就没有问题.
小智 1
你提到你在负载平衡环境中遇到过这个问题,对吧?我假设您正在使用默认的“In Proc”方法来存储会话数据。如果是这样的话,那么我想我知道会发生什么。(为了便于讨论,我假设有 2 个服务器,但如果你有更多服务器也没关系)
您将被发送到 ServerA 并创建一个会话。因为这是 In Process ServerB 对此一无所知。最终(如何发生取决于负载均衡器的设置方式。粘性会话?Cookie?循环?)您将被发送到 ServerB。因为该服务器不知道您已经有一个会话;将创建一个新会话,并为您提供一个新的会话 ID。
那么为什么它会在您的精确重现步骤下发生呢?好吧,我的预感是,如果有足够的时间和负载,您会看到它只是从 /page1 导航到 /page2。同样 - 这取决于您的负载均衡器的设置方式,但也可能是因为您正在更改触发某些内容的协议,并且您被发送到池中的另一台服务器。
你怎样才能解决它?
首先,请确保您的 machine.config 中具有相同的计算机密钥。如果您无权访问它,我认为它可以在 web.config 中使用,但我还没有尝试过。
现在,设置另一种方式来存储会话状态。在 Sql Server 中,也许是 MySql 或 Postgres 或任何地方。如果您有 SQL Server,那么自从构建驱动程序以来,这将是最简单的,但如果您有另一个数据存储,您将需要构建或找到一个可以执行此操作的库。我参与了一个项目,我们使用 Postgres 来存储会话状态。
我们使用npgsql作为连接服务器的驱动程序,并构建了我们自己的驱动程序PgsqlSessionProvider:SessionStateStoreProviderBase,连接起来实际上非常简单
<sessionState mode="Custom" customProvider="PgsqlSessionProvider">
<providers>
<add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" />
</providers>
</sessionState>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |