ASP.NET AJAX负载平衡问题

时间:2020-03-05 18:49:40  来源:igfitidea点击:

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

当App_Code文件夹中的文件未对站点进行预编译时,iis将为这些文件生成随机文件名。

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

因此,当用户发布页面并将其转移到其他服务器时,将无法进行任何操作。

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

解决方案

回答

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

回答

如果它是硬件负载平衡器,那么我们就不会有问题,因为众所周知的就是请求URL,服务器可以在其中编译请求的页面并为其提供服务。

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

回答

确实可以将硬件负载平衡器设置为粘性会话以解决该问题,但是在理想情况下,我希望该功能关闭。

回答

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

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

回答

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

回答

如果质量检查部门可以提升整个库,则可以将app_code中的所有内容移至外部类库。我认为如果我们找不到方便或者可忍受的切换到预编译站点的方式,那么我们就会遇到棘手的问题。

回答

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

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

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

回答

好的,首先要做的是... MachineKey事情是对的。在所有负载平衡计算机上,绝对应将其设置为相同。我不记得它会影响到的所有事情,但是无论如何都要做。

第二,继续并预编译该站点。实际上,只要页面有.cs文件被重新编译,我们实际上仍然可以推出新版本。棘手的是将app_code文件编译成单个dll。但是,如果在那里进行了更改,则可以上载新的dll,再次一切都可以。

为了使事情变得更加简单,请启用"使用的固定命名和单页程序集"选项。这样可以确保每个编译文件的名称相同,因此我们只需测试然后替换更改后的.dll文件即可。

综上所述,我们不应该再遇到任何问题。该请求将发送到IIS,IIS将仅提供该页面并根据需要进行编译。如果后面的代码在每台计算机上都不同,那么实际上没关系,代码相同,并且该计算机将引用其自己的代码。实际的请求/回传不知道或者不关心任何一个。我上面说的所有内容都应该有助于简化操作,但是无论如何它都应该起作用……因此,这可能是一个机器钥匙问题。