我有一个部署在两台服务器上的 asp.net 网站。在服务器前面有一个负载均衡器,用于将请求分发到两台服务器。我们使用 SQL Server 来存储 session 。 我的问题是,如果用户转到该页面,按下一个按钮,然后负载平衡器恰好将其路由到其他服务器,该请求将不会被识别为回发?为什么会这样,只要服务器共享相同的机器 key ,即使使用回发,它也不能正常工作吗?
详细信息:
两台服务器都配置了相同的机器 key ,我通过设置并打印出 session 对象的小调试页面验证了两台服务器上的实际 session 是相同的。
为了进一步验证 key 和 Id,我打印了 HttpRuntime.AppDomainAppId
的值和哈希机器 key (MachineKeySection)ConfigurationManager.GetSection("system.web/machineKey")
和 sessionId Session.SessionID
并在两台服务器上获得相同的输出。我用了Session Debug page作为这个的基础。它的输出看起来像这样(我用虚拟值替换了我的实际 machinkey 哈希和 session 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
站点的 ID(在站点高级设置下的 IISMgr 中找到)在所有服务器上都是相同的。
只要我留在同一台服务器上,一切都会按预期工作。
当我在本地运行页面时(第一个请求到网络场,然后通过 fiddler 将第二个按钮单击路由到本地主机),我得到相同的行为
单步执行代码并阅读 IsPostBack
属性,看来我的问题是 Page 上的 this._fPageLayoutChanged
为真。但是,如果我理解正确的话,当回发发生时它应该是错误的? SO Question on its implementation
两台服务器都运行 IIS 7。
两台服务器都运行带有 SP2 的 Windows Server Web,并安装了相同的 Windows Update 更新。另一方面,我的本地开发机器运行 Windows 7。
最佳答案
事实证明,在 web.config 中添加 Machinekey 的手动条目可以解决问题。非常奇怪,因为我检查了它的全局值以及问题中详述的哈希,但现在它可以工作了。
我收回那句话。在我们上次发布之后问题又回来了,所以添加机器 key 根本没有帮助。
https://stackoverflow.com/questions/11578596/