C# 如何在多线程WCF Web服务中正确使用ServiceBehaviorAttribute.InstanceContextMode?

C# 如何在多线程WCF Web服务中正确使用ServiceBehaviorAttribute.InstanceContextMode?,c#,web-services,wcf,servicehost,C#,Web Services,Wcf,Servicehost,我有ConcurrencyMode.Multiple ans InstanceContextmode.PerSession,但我不了解后者 在我的应用程序中,我喜欢这样: ServiceHost host = new ServiceHost(typeof(MyService), baseAddress); 但是 说明“对于单例生存期行为(例如,如果主机应用程序调用ServiceHost构造函数并传递要用作服务的对象),服务类必须将InstanceContextMode设置为InstanceCo

我有ConcurrencyMode.Multiple ans InstanceContextmode.PerSession,但我不了解后者

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

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

说明“对于单例生存期行为(例如,如果主机应用程序调用ServiceHost构造函数并传递要用作服务的对象),服务类必须将InstanceContextMode设置为InstanceContextMode.Single,否则在打开服务主机时引发异常。”


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

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

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

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

如果希望自己控制实例,则必须初始化类并将对象作为参数传递给ServiceHost构造函数。这称为“单一”实例化模式:

Single:单个InstanceContext(因此也是服务对象)处理应用程序生命周期内的所有客户端请求

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

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