0

我正在调查将我们的网络应用程序转换为网络场。所以我从网络花园开始,通过转换“最大工作进程 = 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. 我想当我们将虚拟目录设置为网络花园时,对虚拟目录的每个请求都由网络花园中的不同进程处理,所以我接下来对服务器的几个请求应该返回 null,因为我已经为一个工作初始化了静态对象过程。但是,即使我连续单击 ajax 按钮 20 次(意味着 20 个请求),静态对象也会返回我的值。

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

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

我对 IIS、静态对象和网络花园的行为感到惊讶。

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

谢谢。

4

1 回答 1

3

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

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

您可以从 IIS 管理器中的 HTTP 响应标头部分的设置公共标头下让 IIS 禁用保活以进行测试。这应该会导致您的浏览器为每个请求打开一个新连接。

要在启用 keepalives 的情况下进行测试,您可以使用 IIS 6 资源工具包中提供的 Web 容量分析工具 (WCAT) 来生成访问 Web 花园中的两个 IIS 进程的多线程负载。

于 2011-12-04T03:10:37.943 回答