Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨对HttpHandler的请求实现单例_C#_Design Patterns_Singleton_Request_Httphandler - Fatal编程技术网

C# 跨对HttpHandler的请求实现单例

C# 跨对HttpHandler的请求实现单例,c#,design-patterns,singleton,request,httphandler,C#,Design Patterns,Singleton,Request,Httphandler,我正在尝试创建一个单例服务,用于处理对HttpHandler的传入请求。此时,服务正在每个请求上实例化。我调用了一个静态类,该类包含服务的一个实例,作为一个单例实现,如下所示: public static class ServerApplication { static Service instance = null; static readonly object padlock = new object(); /// <summary> /// Service singlet

我正在尝试创建一个单例服务,用于处理对HttpHandler的传入请求。此时,服务正在每个请求上实例化。我调用了一个静态类,该类包含服务的一个实例,作为一个单例实现,如下所示:

 public static class ServerApplication {

static Service instance = null;
static readonly object padlock = new object();

/// <summary>
/// Service singleton.
/// </summary>
public static Service Service {
  get {
    lock (padlock) {
      if (instance == null) {
        instance = new Service();
      }
      return instance;
    }
  }
}
我在
instance=newservice()上设置了一个断点行,并带有多个请求
每个请求都会触发断点

我的目标是一个跨请求存在的服务,因为它加载和缓存了来自文件和数据库的大量数据,这些数据可以在大多数请求中重用


有人能看到哪里出了问题吗?

HTTP被设计成可以进行多个并发连接,我不知道您是否会想破坏这一点,除非您在页面加载时很少进行连接。也就是说,也许您可以将HttpHandler保留在会话中?

有几件事:

  • 如果它是一个多处理器框,从技术上讲,您应该使用“volatile”关键字标记共享服务实例,或者使用对MemoryBarrier的调用(请参阅)。您没有指定体系结构,很难说这是否真的是问题所在,但安全总比抱歉好
  • 您应该实现双重检查锁(例如,在获取“挂锁”上的锁之前和之后检查null)。通过这种方式,您可以进行更便宜的比较,而不是在所有后续读取中获取锁

这应该涵盖并发方面的内容。也有可能(尽管可能性较小)在请求之间卸载AppDomain(即,您在web目录中编写了一个文件,导致ASP.NET认为您的应用程序已过时),这将导致重置静态。

一般来说,如果您想要一个单例-看不出是否有必要,我通常是这样实现的:

这段代码的目的是什么?当我听到Singleton和HttpHandler结合在一起时,我的脑海中会出现一个异常。一个基于预先定义的设置呈现图像的图像服务器,该服务中加载并缓存了文件和数据源。因此,服务处理请求并生成正确的映像。为什么?你是说当应用程序运行时只实例化一次的单个对象是一种代码味道吗?Http只是访问它的方法。我可以很容易地构建一个桌面应用程序来与服务交互。如果我错了,请纠正我。我认为这是很正常的。HttpHandler会按照它所说的“处理”Http请求,然后我会像处理任何其他应用程序一样处理请求。它可以像在桌面应用程序上单击按钮一样简单。使HttpHandler成为一个单体,就像试图让汽车漂浮在水面上一样。。。它只是没有做到这一点。我没有使http处理程序成为单例。我写入服务器文件夹中的文本和图像文件,这会导致应用程序池重置吗?我当时的印象是,当你更改了一个.dll,或者更新了web.config。应该是这样的,但我遇到了一些问题,它会变得有点神经质,并且会破坏应用程序池。在global.asax中实现应用程序_End处理程序,如果怀疑发生了这种情况,请设置断点。然后,你可以询问HttpContext,问它为什么应用程序会关闭。我学到了在virdir之外编写临时文件等的艰难方法,只是为了避免类似的事情。:)
ServerApplication.Service.Process(request);