3

我有一些 ASP.NET Web 服务,它们都共享一个公共帮助器类,它们只需要实例化每个服务器的一个实例。它用于简单的数据转换,但在启动期间会花费一些时间从 web.config 文件等加载内容。帮助类是 100% 线程安全的。将其视为一个简单的实用程序调用库。我会在类上共享所有方法,但我想从 web.config 加载初始配置。我们已将 Web 服务部署到 IIS 6.0 并使用应用程序池,其中包含 15 个工作人员的 Web Garden。

我在 Global.asax 中将帮助类声明为 Private Shared 变量,并添加了一个惰性加载 Shared ReadOnly 属性,如下所示:

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

我在构造函数中记录了代码MyHelperClass(),它显示了为每个请求运行的构造函数,即使在同一个线程上也是如此。我确定我只是缺少 ASP.NET 的一些关键细节,但 MSDN 并没有太大帮助。

我已经尝试使用两者来做类似的事情Application("Helper")Cache("Helper")并且我仍然看到构造函数随每个请求一起运行。

4

3 回答 3

3

您可以将 Helper 置于应用程序状态。在 global.asax 中执行此操作:

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

您可以这样使用 Helper:

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

这导致 MyHelperClass 类的单个实例在应用程序启动时创建并处于应用程序状态。由于实例是在 Application_Start 中创建的,因此每个 HttpApplication 实例只发生一次,而不是每个请求。

于 2008-09-15T13:36:12.003 回答
0

我过去在自己的应用程序中做过类似的事情,它导致了各种奇怪的错误。每个用户都可以访问该属性中其他所有人的数据。另外,您最终可能会导致一个用户正在使用它,而不是因为另一个用户的请求而被切断。

没有没有隔离。

于 2008-09-15T13:34:57.293 回答
0

除非您绝对需要,否则使用应用程序状态是不明智的,如果您坚持使用按请求对象,事情会简单得多。任何向辅助类添加状态都可能导致各种细微的错误。使用 HttpContext.Current 项目集合并根据请求对其进行初始化。VB 模块会做你想做的事,但你必须确保不要让它有状态。

于 2008-09-15T13:46:13.303 回答