Web Garden和Static Objects很难理解

时间:2011-11-29 14:51:22

标签: iis-7 static web-garden

我正在调查将我们的Web应用程序转换为Web场。所以我开始使用web garden,转换'Maximum Worker Process = 3'。以下是我的问题的简化版本。

以下是我的静态对象类。

public static class MyStaticObject
{
public static string MyProperty {get;set;}
}     

然后在页面加载中,我按如下方式初始化静态对象 -

MyStaticObject.MyProperty = "My Static Property";

然后使用asp.net ajax [WebMethod]在我的网页上创建ajax方法

[WebMethod()]
public static string getStaticProperty()
{
  return MyStaticObject.MyProperty;
}

//然后我使用Javascript调用此Ajax方法并将返回值设置为文本框。

此测试未按预期工作。以下是我的假设和测试的错误结果。

  1. 我想当我们将虚拟目录设置为web garden时,那么对虚拟目录的每个请求都是由web garden中的不同进程处理的,所以我接下来几个请求到服务器,应该返回null,因为我已初始化一个工作过程的静态对象。但即使我在行中单击ajax按钮20次(意味着20个请求),静态对象也会返回值。

  2. 我正确地假设重新启动IIS应该杀死所有静态对象。

  3. 在网络花园/网络农场中不共享静态对象。

  4. 我对IIS,静态对象和Web园的行为感到惊讶。

    我是假设错误还是我的测试方式错了。

    感谢。

1 个答案:

答案 0 :(得分:3)

您对在AppPools / Web园中管理静态对象的方式的假设是正确的。

但是,您对Web请求分发方式的假设不是。只有在建立新的TCP连接时,http.sys驱动程序才会将HTTP请求循环到IIS工作进程,而不是在新请求到达时。由于默认情况下启用了keepalive,即使您连续发出了20个请求,它们也可能都由同一个IIS工作进程提供服务。

您可以从IIS管理器的“HTTP响应标头”部分的“设置公共标头”下,将IIS禁用Keepalive用于测试目的。这应该会导致您的浏览器为每个请求打开一个新连接。

要启用Keepalive进行测试,可以使用IIS 6 Resource Kit提供的Web容量分析工具(WCAT)生成多线程加载,以访问Web园中的两个IIS进程。