WCF – 实例管理
WCF – 实例管理
WCF 用于将一组消息(客户端请求)绑定到服务实例的一组技术称为实例管理。WCF 支持三种类型的实例激活,本章将讨论它们。
每次通话服务
每次调用服务是 WCF 的默认实例激活模式。为每次调用服务配置 WCF 服务时,会为客户端调用或请求正在进行的时间跨度创建 CLR 对象。CLR 代表公共语言运行时,它包括 WCF 中的服务实例。
在每次调用服务中,每个客户端请求都会实现一个新的专用服务实例,并且与其他类型的实例激活相比,其内存消耗更少。
InstanceContextMode 属性需要设置为 InstanceContextMode.PerCall,以指示 WCF 服务充当每次调用服务。InstanceContextMode 属性属于 ServiceBehavior 属性。因此,可以按如下方式配置每次调用服务 –
[ServiceContract] interface IMyContract {...} [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)] class MyService : IMyContract {...}
此处的服务表示为 IMyContract。下图展示了每次调用服务实例激活的过程。
实现按调用服务
[DataContract] class Param {....} [ServiceContract] interface IMyContract { [OperationContract] void MyMethod(Param objectIdentifier); } class MyPerCallService : IMyContract, IDisposable { public void MyMethod(Param objectIdentifier) { GetState(objectIdentifier); DoWork(); SaveState(objectIdentifier); } void GetState(Param objectIdentifier) {....} void DoWork() {....} void SaveState(Param objectIdentifier) {....} public void Dispose() {....} }
这里,Param 是为上述示例发明的伪类型参数。
每次会话服务
在 WCF 的这种激活模式中,在两个实体(即客户端和特定服务实例)之间维护着一个私有或我们可以说的机密会话。也称为专用会话服务,每会话服务提供一个新的服务实例,该实例保持专用于每个客户端请求,并独立于与该会话感知服务相关的所有其他实例。
要启动每会话服务,需要将 InstanceContextMode 属性设置为 PerSession。在这里,服务实例在整个会话期间都保留在内存中。
激活模式受到可扩展性的影响,因为配置的服务无法支持除少数(或可能多达数百个)之外的任何其他优秀客户端,因为每个专用服务实例都涉及成本。
每个会话服务可以配置为 –
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)] class MyService : IMyContract {...}
每个会话服务的过程可以描述如下图所示 –
以下代码显示了为使用私有会话而配置的合同和服务。输出表明客户端确实获得了专用服务实例。
服务代码
[ServiceContract(Session = true)] interface IMyContract { [OperationContract] void MyMethod(); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] class MyService : IMyContract, IDisposable { int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); } public void MyMethod() { m_Counter++; Console.WriteLine("Counter = " + m_Counter); } public void Dispose() { Console.WriteLine("MyService.Dispose()"); } }
客户代码
MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod(); proxy.Close();
输出
MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()
单例服务
在 WCF 的这种激活模式下,所有相互独立的客户端请求都连接到同一个众所周知的单个实例,而不管它们与服务端点的连接。只有在主机关闭时才会处理单例服务。
此服务仅在创建主机时创建一次。如果主机未提供任何单例实例,则服务返回 NULL。当每个方法调用的工作量很小并且后台没有挂起的操作时,激活模式是最好的。
InstanceContextMode 属性需要设置为 InstanceContextMode.Single 才能启动这个 Singleton 服务。
因此,单例服务可以配置为 –
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] class MySingleton : ... {...}
Singleton 服务的流程如下图所示 –
以下代码用于初始化和托管单例实例。
服务代码
[ServiceContract] interface IMyContract { [OperationContract] void MyMethod( ); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] class MySingleton : IMyContract { int m_Counter = 0; public int Counter { get { return m_Counter; } set { m_Counter = value; } } public void MyMethod( ) { m_Counter++; Trace.WriteLine("Counter = " + Counter); } }
主机代码
MySingleton singleton = new MySingleton( ); singleton.Counter = 42; ServiceHost host = new ServiceHost(singleton); host.Open( ); //Do some blocking calls then host.Close( );
客户端代码
MyContractClient proxy = new MyContractClient( ); proxy.MyMethod( ); proxy.Close( );
输出
Counter = 43