实例上下文(InstanceContextMode):可以简单地理解为服务端的服务实例与客户端的服务代理之间的关联方式;
它主要包括三种模式:(1)单调 Per-Call (2)单例Single (3)会话Per-Session 它是作用在实现服务契约上
1:首先介绍单调模式Per-Call:
代码如下:
[PerCall] public class CalculatorService : ICalculator, IDisposable { public CalculatorService() { Console.WriteLine("{0}: 构造器被调用", Thread.CurrentThread.ManagedThreadId); } ~CalculatorService() { Console.WriteLine("{0}: 终止化器被调用", Thread.CurrentThread.ManagedThreadId); } public void Dispose() { Console.WriteLine("{0}: Dispose方法被调用", Thread.CurrentThread.ManagedThreadId); } public double Add(double x, double y) { Console.WriteLine("{0}: 操作方法被调用", Thread.CurrentThread.ManagedThreadId); return x + y; } }
客户端调用代码:
class Program { static void Main(string[] args) { using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice")) { ICalculator serviceProxy = channelFactory.CreateChannel(); serviceProxy.Add(1, 2); serviceProxy.Add(1, 2); } Console.Read(); } }
结果
*注意:单调模式(Per-Call):对于服务的调用,不论是来自相同的客户端还是不同的客户端,WCF总是创建一个全新的服务实例和实例上下文对象来处理服务调用;当服务操作执行完毕后,实例上下文对象和被封装的服务实例被回收;[单调服务决定于单调实例上下文模式;也就是采用单调实例上下文模式的服务永远是单调服务]
2:单例模式Single
代码如下:
namespace Artech.WcfServices.Service { [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class CalculatorService : ICalculator, IDisposable { public CalculatorService() { Console.WriteLine("{0}: 构造器被调用", Thread.CurrentThread.ManagedThreadId); } ~CalculatorService() { Console.WriteLine("{0}: 终止化器被调用", Thread.CurrentThread.ManagedThreadId); } public void Dispose() { Console.WriteLine("{0}: Dispose方法被调用", Thread.CurrentThread.ManagedThreadId); } public double Add(double x, double y) { Console.WriteLine("{0}: 操作方法被调用", Thread.CurrentThread.ManagedThreadId); return x + y; } } }
客户端代码(分别创建两个实例进行调用):
namespace Artech.WcfServices.Client { class Program { static void Main(string[] args) { using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice")) { ICalculator serviceProxy1 = channelFactory.CreateChannel(); serviceProxy1.Add(1, 2); ICalculator serviceProxy2 = channelFactory.CreateChannel(); serviceProxy2.Add(1, 2); } Console.Read(); } } }
结果显示:
*注意:单例模式Single意味着WCF为每个服务维护一个并且仅维护一个服务实例上下文;不论请求来自相同的服务代理还是不同的服务代理,处理服务调用请求的都是同一个服务实例上下文对象;[单例服务决定于单例实例上下文模式;所以完成由采用的上下文实例上下文模式决定]
3:会话模式Per-Session
WCF为每个服务代理对象分配一个单独的服务实例上下文对象,对于来自相同服务代理的所有服务调用请求,都将分配给相同的服务实例上下文处理;
WCF通过定义SessionModel枚举表示会话的模式分别为:允许(Allowed) ,强制(Required),不允许(NotAllowed) [默认情况下为:Allowed] 它是作用在契约
会话服务决定于会话信道和会话实例上下文模式;所以会话服务由会话模式,绑定和实例上下文模式三都来决定;
*注意:绑定的一些注意事项,BasicHttpBinding 只有创建数据报信道,所以它不能有Allowed或者会报异常;而NetTcpBinding和NetNamedPipeBinding只能创
建会话信道;所以它如果设为NotAllowed也会报异常;而对于WSHttpBinding/Ws2007HttpBinding采用任何一种安全模式或可靠的会话的情况下,会创建会话信
道,否则创建数据报信道;在默认情况下它们采用的是Message安全模式;所以默认下是会话信道;
namespace Artech.WcfServices.Service.Interface { [ServiceContract(Namespace = "http://www.artech.com/", SessionMode = SessionMode.Required)] public interface ICalculator { void Add(double op); } }