1

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

当 App_Code 文件夹中有一个文件,并且网站没有预编译时,iis 会为这些文件生成随机文件名。

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

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

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

4

8 回答 8

2

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

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

于 2008-09-08T22:16:08.770 回答
1

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

于 2008-09-08T21:49:23.543 回答
1

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

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

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

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

于 2009-07-15T18:59:34.603 回答
0

如果它是一个硬件负载平衡器,你应该没有问题,因为所有已知的都是请求 URL,服务器将在其中编译请求的页面并提供它。

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

于 2008-09-08T21:49:53.870 回答
0

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

于 2008-09-08T21:57:59.640 回答
0

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

于 2008-09-09T00:11:15.903 回答
0

如果您的 QA 部门可以提升整个库,您可以将 app_code 中的任何内容移动到外部类库。如果您找不到方便或可容忍的方式来切换到预编译的站点,我认为您会遇到棘手的会话。

于 2008-09-09T05:53:57.203 回答
0

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

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

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

于 2008-10-10T09:09:23.503 回答