ASP.NET中的请求或服务器的静态类实例是唯一的吗?

Dan*_*ert 179 c# asp.net static

在ASP.NET网站上,是每个Web请求唯一的静态类,还是在需要时实例化它们并在GC决定处理它们时进行GC操作?

我问的原因是因为我之前在C#中编写了一些静态类,并且行为与我预期的不同.我希望静态类对每个请求都是唯一的,但似乎并非如此.

如果它们并非每个请求都是唯一的,那么有没有办法让它们成为现实?

更新:
答案给了我正是我所需要的.我已经在使用单例类,但是它使用的是一个静态实例,因此即使用户不同也在请求之间共享,在这种情况下这是一件坏事.使用HttpContext.Current.Items完美地解决了我的问题.对于任何在将来偶然发现这个问题的人来说,这是我的实现,简化和缩短,以便易于理解模式:

using System.Collections;
using System.Web;

public class GloballyAccessibleClass
{
    private GloballyAccessibleClass() { }

    public static GloballyAccessibleClass Instance
    {
        get
        {
            IDictionary items = HttpContext.Current.Items;
            if(!items.Contains("TheInstance"))
            {
                items["TheInstance"] = new GloballyAccessibleClass();
            }
            return items["TheInstance"] as GloballyAccessibleClass;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

dri*_*iis 142

静态类和静态实例字段在对应用程序的所有请求之间共享,并且与应用程序域具有相同的生命周期.因此,在使用静态实例时应该小心,因为您可能会遇到同步问题等.还要记住,在应用程序池被回收之前,静态实例不会被GC控制,因此静态实例引用的所有内容都不会被GC控制.这可能导致内存使用问题.

如果您需要与请求具有相同生命周期的实例,我建议您使用该HttpContext.Current.Items集合.这是设计意味着存储您需要的东西的地方.为了获得更好的设计和可读性,您可以使用Singleton模式来帮助您管理这些项目.只需创建一个存储其实例的Singleton类HttpContext.Current.Items.(在我的ASP.NET公共库中,我有一个通用的SingletonRequest类用于此目的).

  • 你能提供一个涉及`HttpContext.Current.Items`的Singleton模式样本吗? (3认同)

Mos*_*ner 27

静态成员只具有当前工作进程的范围,因此它与请求无关,因为同一工作进程可能会或可能不会处理不同的请求.

  • 为了与特定用户和请求共享数据,请使用HttpContext.Current.Session.
  • 要在特定请求中共享数据,请使用HttpContext.Current.Items.
  • 为了在整个应用程序中共享数据,要么为其编写机制,要么将IIS配置为使用单个进程并编写单例/使用应用程序.

顺便说一句,默认的工作进程数是1,所以这就是为什么Web上充满了人们认为静态成员具有整个应用程序的范围的原因.


Sij*_*jin 11

由于类型包含在应用程序域中,因此只要应用程序域未被回收,或者请求由其他应用程序域提供,我就会希望存在静态类.

我可以想到几种方法来使特定于特定请求的对象取决于您想要做什么,例如,您可以在Application.BeginRequest中实例化该对象,然后将其存储在HttpRequest对象中,以便所有对象都可以访问它.请求处理管道.