我在WCF中很新,并试图了解各种实例管理技术,我能够理解Per-Call&单例实例模式,但我在每个会话实例模式中感到困惑,在这种情况下,每个客户端都创建一个单独的会话吗?但它没有发生在我的情况下:
我的WCF服务: -
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession )]
public class CounterService : ICounterService
{
int _counter = 0;
public int GetCount()
{
_counter++;
return _counter;
}
}
客户代码: -
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();
}
但是,控制台显示结果为1,1,1 --- 1,1,1但我认为它应该是1,2,3 --- 1,2,3 我错了吗?请帮忙! TIA
答案 0 :(得分:5)
我想也许解释它的最好方法是通过这些图表(借鉴CodePlex article主题):
grock的主要概念是,当给定客户端在PerSession模式下为服务创建代理时,从该代理重复调用该服务将调用相同的服务实例(特定于该客户端)。这允许您在服务对象中为客户端存储一些状态,因为每个客户端都有自己的服务对象实例。
这与PerCall和Singleton形成鲜明对比如下:
当您为PerCall服务创建代理时,每次调用服务操作时都会获得一个全新的服务对象实例。
当您为SingleTon服务创建代理时,该服务只有一个实例处理所有客户端请求。
答案 1 :(得分:2)
会话意味着您可以使用asp.net中的Session对象,而不是服务对象=它自己被重用。您可以将计数值保存在Session对象中,但不会得到预期的结果。结果将是1,2,3 --- 4,5,6