- WCF 教程
- WCF - 首页
- WCF - 概述
- WCF - 与 Web 服务对比
- WCF - 开发人员工具
- WCF - 架构
- WCF - 创建 WCF 服务
- WCF - 托管 WCF 服务
- WCS - IIS 托管
- WCF - 自托管
- WCF - WAS 托管
- WCF - Windows 服务托管
- WCF - 使用 WCF 服务
- WCF - 服务绑定
- WCF - 实例管理
- WCF - 事务
- WCF - RIA 服务
- WCF - 安全性
- WCF - 异常处理
- WCF 资源
- WCF - 快速指南
- WCF - 有用资源
- WCF - 讨论
WCF - 实例管理
WCF 用于将一组消息(客户端请求)绑定到服务实例的技术称为实例管理。WCF 支持三种类型的实例激活,本章将对此进行讨论。
每次调用服务
每次调用服务是 WCF 的默认实例激活模式。当 WCF 服务配置为每次调用服务时,将在客户端调用或请求进行的持续时间内创建一个 CLR 对象。CLR 代表公共语言运行时,它包含 WCF 中的服务实例。
在每次调用服务中,每个客户端请求都会获得一个新的专用服务实例,并且与其他类型的实例激活相比,其内存消耗更少。
为了指示 WCF 服务充当每次调用服务,需要将 InstanceContextMode 属性设置为 InstanceContextMode.PerCall。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 以启动此单例服务。
因此,可以按如下方式配置单例服务:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}
单例服务的过程如下图所示:
以下代码用于初始化和托管单例实例。
服务代码
[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