我有一个 WebService,它拥有一个 Singleton:
public class WebService
{
private static Singleton _singleton = Singleton.Instance;
public void DoSomeJob(object jobObj) {
_singleton.QueueJob(jobObj);
}
}
.. 和单例,它应该是线程安全的。
public static Singleton Instance
{
get
{
lock (_syncRoot)
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
}
}
我打算通过这种方式实现的是,每个调用我的 WebService 的客户端都将其对象提供给同一个单例实例。同样,这个单例除了将对象排队并在计时器计时时对其进行处理外,实际上并没有做更多的事情。
我曾经(现在仍然)面临的问题是,每次 WebService 终止时,Singleton 都会被杀死。但是,我不确定是否会发生这种情况,因为 Singleton 的所有者正在被破坏,或者由于应用程序池设置给出的某种原因。 我试图让应用程序池在空闲时“始终运行”和“暂停”,而不是“按需”和“终止”——没有成功:-/
为什么 Singleton 每次都被杀死?如何在 WebService 执行之间保持 Singleton 的实例事件?
最佳答案
Why is the Singleton getting killed off each time?
您需要了解 WCF 如何管理服务 instancing了解这是为什么。默认情况下,WCF 将通过 session-enabled binding 为每个客户端创建一个新的服务实例。 ,如果不支持 session ,则每次调用。
这意味着被调度来处理客户端调用的服务实例会将您的单例实例加载到内存中。但是,当客户端 session 或个人调用(不支持 session )完成时,实例将被卸载,这意味着您的单例也将被卸载。
How can I keep the Singleton's instance alive between WebService executions?
有两种方法:
- 摆脱你的单例。使用后备数据存储来维护您在多个客户端调用中的状态。
- 通过在服务实现声明中设置
InstanceContextMode=InstanceContxtMode.Single
来使用单例服务实例。
在这两个选项中,我会选择选项 1。这是因为单例服务实例通常是一种反模式,因为它们 do not scale , 并且只有在别无选择时才应使用。
....considered to implement the queueing functionality to an external component, e.g. a windows service, but for the purpose of simplicity and reduced complexity I would like to implement that within the WebService
好的,这就是我认为问题的根源所在。围绕分布式系统有一个共同的信念,可以表述如下:
- 简单 = 更少的组件,并且
- 复杂=更多组件
我会将这种信念修改为:
- 简单 = 简单的组件,并且
- Complex = 复杂的组件
在我看来,您决定将定时器/排队要求自动嵌入到您的 Web 服务中会使您的组件变得复杂。
我认为将从队列中读取的组件分解为另一个组件正是您需要做的!
如果这让您望而生畏,那么我强烈建议您使用 topshelf管理您的 Windows 服务,这是一个免费的框架,它使服务的创建和部署变得非常简单。
关于c# WebService 杀死它拥有的 Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32339834/