📅  最后修改于: 2020-11-19 09:26:07             🧑  作者: Mango
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