如何在多线程WCF Web服务中正确使用ServiceBehaviorAttribute.InstanceContext

本文关键字:InstanceContext ServiceBehaviorAttribute 服务 多线程 WCF Web | 更新日期: 2023-09-27 18:24:32

我有ConcurrentMode.Multiple和InstanceContextmode.PerSession,但我不理解后者。

在我的应用程序中,我确实喜欢这样:

ServiceHost host = new ServiceHost(typeof(MyService), baseAddress);

但是http://msdn.microsoft.com/en-us/library/system.servicemodel.instancecontextmode(v=vs.110).aspx

告诉"对于单例生存期行为(例如,如果主机应用程序调用ServiceHost构造函数并传递一个对象用作服务),服务类必须将InstanceContextMode设置为InstanceContextMode.Single,或者在打开服务主机时抛出异常。"

这不是我在做的吗?它工作得很好,而且是多线程的。如果有人能向我解释PerSession和PerCall的价值观,我将不胜感激。会话不是也是一个电话吗?

如何在多线程WCF Web服务中正确使用ServiceBehaviorAttribute.InstanceContext

当您将服务类类型作为参数传递时,您希望该类的实例在需要时创建(当收到客户端调用时)。因此,您不能自己控制服务实例的生存期。实例化有两种类型:

PerCall:为每个客户端请求创建一个新的InstanceContext(以及服务对象)。

PerSession:为每个新的客户端会话创建一个新的InstanceContext(以及服务对象),并在整个生命周期内进行维护(这需要一个支持会话的绑定)。

如果你想自己控制实例化,你必须初始化类,并将对象作为参数传递给ServiceHost构造函数。这被称为";单个";实例化模式:

Single:单个InstanceContext(以及服务对象)处理应用程序生存期内的所有客户端请求。

在这种情况下,您必须在服务类中将ServiceBehaviorAttribute.InstanceContextMode属性设置为Single

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class MyService : IMyService
{
    public void SomeMethodHere(parm) {}
}