【问题标题】:SessionMode and InstanceContextMode difference in WCFWCF 中 SessionMode 和 InstanceContextMode 的区别
【发布时间】:2015-04-05 11:05:45
【问题描述】:

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

我知道我们可以为这两个属性使用不同的值,但是这两种方法之间到底有什么区别?

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

【问题讨论】:

  • 这在this page 上解释得很简洁,我想。您是否有某个特定场景不确定要使用什么?

标签: c# wcf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    其实这两种方法是有区别的。 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

    备注:我经历过一件奇怪的事情。当您使用SessionMode.Required 标记接口并使用InstanceContextMode.PerCall 标记类时,不会引发异常并且everythink 工作正常。谁能解释一下为什么?

    【讨论】:

    • 我建议您将最后一段作为新问题发布。 Stack Overflow 不是一个讨论论坛,因此答案不应包含更多问题。
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多