WCF实例管理-PerSession模式

Rah*_*ngh 5 c# wcf

我是WCF的新手,试图了解各种实例管理技术,我能够理解Per-Call和Singleton实例模式,但是我对每个会话实例模式感到困惑,在这种情况下,为每个客户端创建单独的会话对吗?但是在我的情况下却没有发生:

我的WCF服务:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession )]
public class CounterService : ICounterService
{
    int _counter = 0;
    public int GetCount()
    {
        _counter++;
        return _counter;
    }
}
Run Code Online (Sandbox Code Playgroud)

客户代码:-

static void Main(string[] args)
    {
        CounterServiceReference.CounterServiceClient proxy = new     CounterServiceReference.CounterServiceClient();
        CounterServiceReference.CounterServiceClient proxy1 = new CounterServiceReference.CounterServiceClient();
        Console.WriteLine("WCF Instance mode: Per Session");
        Console.WriteLine("Invoking WCF service...");
        Console.WriteLine("Counter: {0}", proxy.GetCount());
        Console.WriteLine("Counter: {0}", proxy.GetCount());
        Console.WriteLine("Counter: {0}", proxy.GetCount());

        Console.WriteLine("---------------------------------------");
        Console.WriteLine("Counter: {0}", proxy1.GetCount());
        Console.WriteLine("Counter: {0}", proxy1.GetCount());
        Console.WriteLine("Counter: {0}", proxy1.GetCount());
        Console.ReadKey();
    }
Run Code Online (Sandbox Code Playgroud)

但是,控制台将结果显示为1,1,1 --- 1,1,1,但我认为应该为1,2,3 --- 1,2,3我在某处错了吗?请帮忙!TIA

cod*_*urn 5

我认为也许最好的解释方法是通过以下图表(摘自该主题的CodePlex文章):

每届WCF 每次通话WCF 在此处输入图片说明

grock的主要概念是,当给定的客户端以PerSession模式创建服务的代理时,从该代理重复调用该服务将调用同一服务实例(特定于该客户端)。这使您可以将某些状态存储在客户端的服务对象中,因为每个客户端都有自己的服务对象实例。

这与PerCall和Singleton形成对比,如下所示:

当创建PerCall服务的代理时,每次调用服务操作时,都会获得服务对象的新实例。

当您创建一个SingleTon服务的代理时,该服务只有一个实例可以处理所有客户端请求。