我有一个WebService,它拥有一个Singleton:
public class WebService
{
private static Singleton _singleton = Singleton.Instance;
public void DoSomeJob(object jobObj) {
_singleton.QueueJob(jobObj);
}
}
..和Singleton,它应该是线程安全的。
public static Singleton Instance
{
get
{
lock (_syncRoot)
{
if (_instance == null)
_instance = new Singleton();
return _instance;
}
}
}
}
我将以这种方式实现的是,每个调用我的WebService的客户端都将其对象提供给单例的同一个实例。再次,这个单例并不比排队对象并在计时器滴答时处理它更多。
我面临的问题(现在仍然是),每次WebService终止时,Singleton都会被杀死。但是,我不确定是否会发生这种情况,因为Singleton的所有者正在被破坏或由于应用程序池设置给出的某些原因。 我试图让应用程序池在闲置时“始终运行”和“暂停”,而不是“按需”和“终止” - 没有成功: - /
为什么单身人士每次都会被杀掉?如何在WebService执行之间保持Singleton的实例存活?
答案 0 :(得分:1)
为什么单身人士每次都会被杀掉?
您需要了解WCF如何管理服务instancing以了解其原因。默认情况下,WCF将在session-enabled binding上为每个客户端创建一个新的服务实例,如果不支持会话则每次调用。
这意味着,为处理客户端调用而调度的服务实例会将单例实例加载到内存中。但是,当客户端会话或单个调用(没有支持会话)完成时,实例将被卸载,这意味着您的单例也将被取消。
如何在WebService之间保持Singleton的实例存活 执行?
有两种方法可以做到这一点:
InstanceContextMode=InstanceContxtMode.Single
,使用单例服务实例。 在选项1的两个选项中,这是因为单例服务实例通常是反模式,因为它们是do not scale,并且只应在没有替代时使用。
....考虑将排队功能实现到外部 组件,例如Windows服务,但为了简单起见 并且降低了复杂性我想在其中实现 WebService的
好的,我认为问题的根源在哪里。有关ditributed系统的共同信念,可以说如下:
我会将这种信念修改为:
在我看来,您决定将计时器/排队要求嵌入到您的网络服务中会自动使您的组件变得复杂。
我认为将从队列中读取的组件分解为另一个组件正是您需要做的!
如果这对您来说是令人生畏的,那么我强烈建议您使用topshelf来管理您的Windows服务,这是一个免费的框架,它使服务的创建和部署变得非常简单。