对于在App_Code文件夹中包含代码并使用硬件负载均衡器的任何人来说,这都是一个问题。真正的硬件负载均衡器可以设置为粘性会话来解决问题,但在一个完美的世界中,我希望关闭该功能。
当App_Code文件夹中的文件和网站未预编译时,iis将为这些文件生成随机文件名。
server1 "/ajax/SomeControl, App_Code.tjazq3hb.ashx"
server2 "/ajax/SomeControl, App_Code.wzp3akyu.ashx"
因此,当用户发布页面并转移到其他服务器时,无效。
有人有解决方案吗?我可以更改为预编译的网站,但是我们的QA部门无法宣传已更改的文件。
答案 0 :(得分:2)
你有< machinekey>两台服务器上的节点设置为相同的值?
您可以覆盖web.config中的machine.config文件来设置它。这需要匹配,否则你可能会遇到这样的奇怪情况。
答案 1 :(得分:1)
您的负载均衡器是否支持粘性会话?启用此选项后,平衡器将在特定时间窗口内反复将相同的IP路由到同一服务器。这样,来自一个客户端的所有请求(AJAX或其他)将始终命中集群/服务器场中的同一服务器。
答案 2 :(得分:1)
好的,首先要做的事情...... MachineKey是真的。在所有负载平衡机器上应该完全相同。我不记得它影响的一切,但无论如何都要这样做。
其次,继续预编译网站。实际上,只要页面的.cs文件被重新编译,您就可以推出新版本。令人困惑的是将app_code文件编译成单个dll。但是,如果在那里进行了更改,您可以上传新的dll,并且一切都应该没问题。
为了使事情变得更加简单,请启用“使用的固定命名和单页面程序集”选项。这将确保每个编译的名称都相同,因此您只需测试然后替换更改的.dll文件。
所有这些都说,你不应该有问题。请求转到IIS,它只提供页面并根据需要进行编译。如果后面的代码在每台机器上是不同的,那么它真的应该没关系,代码是相同的,并且该机器将引用它自己的代码。实际的请求/回发不知道或关心任何这些。我上面说的所有内容都应该有助于简化事情,但它应该正常工作......所以它可能是一个机器密钥问题。
答案 3 :(得分:0)
如果它是硬件负载均衡器,那么您应该没有问题,因为所有已知的都是请求URL,服务器将在其中编译所请求的页面并提供服务。
我能想到的唯一问题就是会话和视图状态。
答案 4 :(得分:0)
真正的硬件负载均衡器可以设置为粘性会话来解决问题,但在一个完美的世界中,我希望关闭该功能。
答案 5 :(得分:0)
似乎只适用于ViewState加密。它不会影响自动编译程序集的文件名。
答案 6 :(得分:0)
如果您的QA部门可以宣传整个图书馆,您可以将app_code中的任何内容移动到外部类库。如果您无法找到方便或可以容忍的方式切换到预编译的网站,我认为您会遇到粘性会话。
答案 7 :(得分:0)
我认为asp.net模型对加密和机器特定存储有相当大的依赖性,所以我不确定它是否能够避免会话的粘性IP。
我不知道ASP.NET AJAX(我使用的是MonoRail NJS方法),但会话状态对您来说可能是一个问题。
您必须确保会话状态是可序列化的,并且不要使用InMemory会话。您可能需要运行ASP.NET会话状态服务器以确保整个前端服务器场使用相同的会话存储。在这种情况下,会话必须是完全可序列化的(这就是为什么会话中的对象不是首选,你必须总是使用ID,我打赌MS在他们进行AJAX库开发时坚持这个限制)