WCF中的SessionMode和InstanceContextMode差异

时间:2015-02-05 14:31:48

标签: c# wcf

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

实际上,这两种方法之间存在差异。 SessionModeServiceContract属性的属性。 ServiceContract属性应应用于接口。 InstanceContextMode属性是ServiceBehaviour属性的成员,该属性应用于服务(类)的实际实现。

因此,使用SessionMode属性,您可以定义SessionModes的类型,以允许在实际服务上实现。并使用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标记类时,不会引发异常,并且一切都可以正常工作。谁能解释我为什么?