我目前正在研究WCF会议,在阅读了MSDN上的一些文章之后......我感到困惑的一件事是我们可以在WCF中使用SessionMode和InstanceContextMode之间的明显区别。
我知道我们可以用于这两个属性的不同值,但这两种方法之间究竟有什么区别?
为什么在WCF中有这两种方法?
虽然这两个值看似相似并且在某些方面相互作用,但这些设置实际上控制了WCF
服务的不同方面。 InstanceContextMode
属性用于控制应用程序何时创建新服务对象。另一方面,SessionMode
表示会话是允许的,不允许的还是必需的。
一些额外的评论链接: https://msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.sessionmode(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode(v=vs.110).aspx
实际上这两种方法之间存在差异。 SessionMode
是ServiceContract
属性的属性。 ServiceContract
属性应该应用于接口。而InstanceContextMode
属性是ServiceBehaviour属性的成员,该属性应用于服务(类)的实际实现。
因此,使用SessionMode
属性,您可以定义允许在实际服务上实现的SessionMode类型。使用InstanceContextMode
属性,您可以定义服务的实际实现行为。
如果界面标有SessionMode.NotAllowed
[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface IHelloService
{
[OperationContract]
string SayHello();
}
该课程标有InstanceContextMode.PerSession
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class HelloService : IHelloService
{
private int _requestCount;
public string SayHello()
{
_requestCount++;
return $"Hello this is your {_requestCount} request";
}
}
一旦您尝试托管服务,将在运行时抛出System.InvalidOperationException
。
备注:我经历过的一件奇怪的事。当您使用SessionMode.Required
标记接口并使用InstanceContextMode.PerCall
标记该类时,不会抛出任何异常并且每个方面都可以正常工作。谁能解释我为什么?