2008-09-08 87 views
1

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

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

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

所以当一个用户发布的页面,并被转移到另一台服务器没有任何作品。

有没有人有解决方案?我可以更改为预编译的网站,但是我们将失去QA部门仅仅推广已更改文件的能力。

回答

0

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

+0

这种唯一的方法,我已经解决了这个问题,没有开启粘滞会话。 – 2009-11-10 06:08:11

1

您的负载均衡器是否支持粘性会话?有了这个,平衡器将在同一个时间窗口内将相同的IP路由到同一台服务器。通过这种方式,来自一个客户端的所有请求(AJAX或其他)将始终访问集群/服务器场中的同一台服务器。

+0

其真正的硬件负载平衡器可以设置为粘性会话来解决问题,但在完美的世界中,我希望关闭该功能。 – 2008-09-10 04:55:28

0

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

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

0

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

2

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

您可以重写web.config中的machine.config文件来设置它。这需要匹配,否则你可以得到这样的奇怪的情况。

+0

看起来像只影响ViewState – 2008-09-11 23:56:03

0

看来,这只是ViewState加密。它不会影响自动编译程序集的文件名。

0

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

我不知道ASP.NET AJAX(我使用MonoRail NJS方法代替),但会话状态可能是您的问题。

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

1

好吧,第一件事第一MachineKey的事情是真的。在所有负载均衡的机器上,这应该完全相同。我不记得它所影响的一切,但无论如何都要这样做。

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

为了使事情更简单,请启用“使用固定命名和单页装配”选项。这将确保每个编译中的事物具有相同的名称,因此您只需测试然后替换已更改的.dll文件。

所有这一切说,你不应该有问题。请求转到IIS,它只是提供页面并根据需要进行编译。如果后面的代码在每台机器上都不相同,那么代码是相同的,并且该机器将引用它自己的代码。实际的请求/回发不知道或关心任何这些。我上面提到的所有东西都应该能够帮助简化事情,但无论如何它都应该可以工作......所以这可能是一个机器问题。