首页 文章

WCF中的SessionMode和InstanceContextMode差异

提问于
浏览
0

我目前正在研究WCF会话,在阅读了MSDN上的一些文章之后......我感到困惑的一件事是我们可以在WCF中使用SessionMode和InstanceContextMode之间的明显区别 .

我知道我们可以用于这两个属性的不同值,但这两种方法之间究竟有什么区别?

为什么在WCF中有这两种方法?

2 回答

  • 0

    虽然这两个值看起来相似并且在某些方面相互作用,但这些设置实际上控制了 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

  • 0

    实际上这两种方法之间存在差异 . SessionModeServiceContract 属性的属性 . 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 .

    Remark :我经历过的一件奇怪的事 . 使用 SessionMode.Required 标记接口并使用 InstanceContextMode.PerCall 标记类时,不会抛出任何异常,并且每个方法都可以正常工作 . 谁能解释我为什么?

相关问题