对于在 App_Code 文件夹中拥有代码并使用硬件负载平衡器的任何人来说,这都是一个问题。确实可以将硬件负载平衡器设置为粘性会话来解决问题,但在完美的世界中,我希望关闭该功能。

当App_Code文件夹中的某个文件,并且站点未预编译时,iis会为这些文件生成随机文件名。

server1 "/ajax/SomeControl, App_Code.tjazq3hb.ashx"
server2 "/ajax/SomeControl, App_Code.wzp3akyu.ashx"

因此,当用户发布页面并转移到其他服务器时,没有任何效果。

有人有解决方案吗?我可以更改为预编译的网站,但我们的 QA 部门将无法推广更改后的文件。

有帮助吗?

解决方案

如果您的 QA 部门可以推广整个库,您可以将 app_code 中的任何内容移动到外部类库。我认为,如果您找不到方便或可以忍受的方式来切换到预编译站点,那么您就会陷入粘性会话。

其他提示

您是否将两台服务器上的 <machinekey> 节点设置为相同的值?

您可以覆盖 web.config 中的 machine.config 文件来进行设置。这需要匹配,否则你可能会遇到这样的奇怪情况。

您的负载均衡器支持粘性会话吗?启用此功能后,平衡器将在特定时间窗口内一遍又一遍地将相同的 IP 路由到同一服务器。这样,来自一个客户端的所有请求(AJAX 或其他方式)将始终到达集群/场中的同一服务器。

好吧,首先要做的事情是……MachineKey 的事情是真的。在所有负载平衡机器上绝对应该将其设置为相同。我不记得它影响的一切,但无论如何还是要做。

其次,继续预编译该站点。实际上,只要页面有 .cs 文件,该页面就会重新编译,您仍然可以推出新版本。棘手的是 app_code 文件被编译成单个 dll。但是,如果其中进行了更改,您可以上传新的 dll,并且一切都会正常。

为了使事情变得更加简单,请启用“使用固定命名和单页程序集”选项。这将确保每次编译时内容具有相同的名称,因此您只需测试然后替换更改的 .dll 文件。

综上所述,您不应该遇到问题。请求发送到 IIS,IIS 只提供页面并根据需要进行编译。如果每台机器上的后面的代码不同,那真的不重要,代码是相同的,并且该机器将引用它自己的代码。实际的请求/回发不知道也不关心这些。我上面所说的一切应该有助于简化事情,但无论如何它应该有效......所以这可能是一个机器密钥问题。

如果它是硬件负载平衡器,则不会有问题,因为已知的只是请求 URL,服务器将在其中编译请求的页面并为其提供服务。

我能想到的唯一问题是会话和视图状态。

确实可以将硬件负载平衡器设置为粘性会话来解决问题,但在完美的世界中,我希望关闭该功能。

看来仅适用于 ViewState 加密。它不会影响自动编译程序集的文件名。

我认为 asp.net 模型对加密和机器特定存储有相当大的依赖性,所以我不确定它是否可以避免会话的粘性 IP。

我不了解 ASP.NET AJAX(我使用 MonoRail NJS 方法),但会话状态对您来说可能是个问题。

您必须确保会话状态是可序列化的,并且不要使用内存中会话。您可能需要运行 ASP.NET 会话状态服务器以确保整个前端场使用相同的会话存储。在这种情况下,会话必须是完全可序列化的(这就是为什么会话中没有对象是首选的,你必须始终使用 ID,我敢打赌 MS 在进行 AJAX 库开发时会坚持这个限制)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top