【发布时间】:2012-07-19 16:27:27
【问题描述】:
我有一个部署在两台服务器上的 asp.net 网站。在服务器前面有一个负载均衡器,将请求分发到两台服务器。为了存储会话,我们使用 SQL Server。 我的问题是,如果用户转到该页面,按下一个按钮,然后负载均衡器恰好被路由到另一台服务器,该请求不会被识别为回发?为什么会这样,只要服务器共享相同的机器密钥,即使使用回发也不应该正常工作吗?
详情:
-
两台服务器都配置了相同的机器密钥,并且我通过设置并打印出会话对象的小型调试页面验证了两台服务器上的实际会话相同。
李> -
为了进一步验证密钥和 ID,我打印了
HttpRuntime.AppDomainAppId的值和哈希机器密钥(MachineKeySection)ConfigurationManager.GetSection("system.web/machineKey")和 sessionIdSession.SessionID,并在两台服务器上得到了相同的输出。我使用Session Debug page 作为这个基础。它的输出看起来像这样(我用虚拟值替换了我的实际机器密钥哈希和会话 ID):Current DataTime: 2012-07-20 10:52:58 Current Session Mode: SQLServer HttpRuntime.AppDomainAppId: /LM/W3SVC/5/ROOT Hashed with the MachineKey: HjtOPW5dfoihdlkd+SdsfkEWfs0= Local Machine Name: 127.0.0.1 Current Session ID: 2alsudhsdkjlhcmnsdfkhsdf 在站点高级设置下的 IISMgr 中找到的站点 ID 在所有服务器上都是相同的。
只要我留在同一台服务器上,一切都会按预期工作。
当我在本地运行页面时(第一次请求到网络场,然后通过提琴手将第二个按钮点击路由到本地主机),我得到相同的行为
单步执行代码并阅读
IsPostBack属性,看来我的问题是页面上的this._fPageLayoutChanged是真的。但是,如果我理解正确的话,回发发生时它应该是错误的吗? SO Question on its implementation两台服务器都运行 IIS 7。
两台服务器都运行带有 SP2 的 Windows Server Web 并安装了相同的 Windows 更新更新。另一方面,我的本地开发机器运行 Windows 7。
【问题讨论】:
-
检查负载均衡器是否启用了粘性会话。
-
这有关系吗?通过在两台服务器上使用相同的机器密钥并将会话存储在数据库中,我认为 ASP.Net 不会关心哪个服务器处理了请求?
-
对不起,我没有正确理解这个问题...IsPostback 不应该变成假
标签: asp.net ispostback