WCF中的SessionMode和InstanceContextMode差异

问题描述 投票:0回答:2

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

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

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

c# 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

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

© www.soinside.com 2019 - 2024. All rights reserved.