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