WCF初探-27:WCF中的实例化
理解WCF中的实例化机制
- “实例化”是指对用户定义的服务对象以及与其相关的 InstanceContext 对象的生存期的控制。也就是说我们的客户端程序在调用服务端方法时,需要实例化一个服务端代理类对象,实例化就是对这个对象的生命周期的管理(比如:代理服务对象的创建,对象调用服务端方法后需要对其进行的回收处理)。

- 实例化行为(使用 System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode 属性进行设置)控制如何创建 InstanceContext 以响应传入的消息。默认情况下,每个 InstanceContext 都与一个用户定义服务对象相关联,因此设置 InstanceContextMode 属性也可以控制用户定义服务对象的实例化。InstanceContextMode 枚举定义了实例化模式。可以使用下列实例化模式:
- PerCall:单调模式,为每个客户端请求创建一个新的 InstanceContext(以及相应的服务对象)。
- PerSession:会话模式,这是InstanceContextMode的默认值,为每个新的客户端会话创建一个新的 InstanceContext(以及相应的服务对象),并在该会话的生存期内对其进行维护(这需要使用支持会话的绑定)。
- Single:单例模式,单个 InstanceContext(以及相应的服务对象)处理应用程序生存期内的所有客户端请求。
单调模式(PerCall)下的服务实例
- 在单调模式(PerCall)中,WCF总是创建一个新的服务实例上下文来处理请求对象,即调用一次方法就会创建一个实例上下文对象,调用完成后依靠GC机制释放对象(可能会有延迟),再调用下一个方法时也会创建一个新的服务实例上下文对象。因此,在一个服务通道会话中可能出现多个实例上下文对象

- 接下来我将通过示例来验证单调模式下的实例处理请求的方式。解决方案的创建请参照WCF初探-26:WCF中的会话,此示例中,我们采用GetInstanceId()来获取服务端实例化的次数,采用GetOperationCount()来获取调用方法的计数器。ISampleMethod.cs的代码如下:
using System.ServiceModel;
namespace Service{
[ServiceContract(SessionMode=SessionMode.Required)]
public interface ISampleMethod{
[OperationContract]
string MethodOne(string msg);
[OperationContract]
string MethodTwo(string msg);
[OperationContract]
int GetInstanceId(); //获取服务实例ID
[OperationContract]
int GetOperationCount(); //获取调用操作方法的计数器
}}
SampleMethod.cs的代码如下:
using System.ServiceModel;
namespace Service{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class SampleMethod:ISampleMethod
{
static int instanceCount;
int instanceId;
int operationCount; public SampleMethod()
{
instanceCount++;
instanceId = instanceCount;
} public string MethodOne(string msg)
{
operationCount++;
return "You called MethodOne return message is: " + msg;
} public string MethodTwo(string msg)
{
operationCount++;
return "You called MethodTwo return message is: " + msg;
} public int GetInstanceId()
{
return instanceId;
} public int GetOperationCount()
{
return operationCount;
}
}
}
寄宿服务后,使用svcutil.exe生成客户端代理类和配置文件,客户端参考代码如下:
class Program{
static void Main(string[] args){
SampleMethodClient client1 = new SampleMethodClient();
CallMethod(client1);
SampleMethodClient client2 = new SampleMethodClient();
CallMethod(client2);
Console.Read();
}
static void CallMethod(SampleMethodClient client){
Console.WriteLine(client.MethodOne("MethodOne"));
Console.WriteLine("InstanceId:{0},OperationCount:{1}", client.GetInstanceId(), client.GetOperationCount());
Console.WriteLine(client.MethodTwo("MethodTwo"));
Console.WriteLine("InstanceId:{0},OperationCount:{1}", client.GetInstanceId(), client.GetOperationCount());
}
}
运行结果如下:

- 运行结果说明如下:
- Client1调用MethodOne()时,会进入到SampleMethod构造函数此时instanceCount会加1,所以instanceId等于1,operationCount加1后的值为1.
- Client1调用GetInstanceId()时,会再次进入SampleMethod构造函数产生新的实例,由于instanceCount为静态变量,所以再次加1后会变成2,所以instanceId等于2。operationCount的普通变量,所以实例化后不会记录先前的值,调用GetOperationCount()时operationCount没有加量操作。所以为默认值0.调用GetOperationCount()后instanceId的值等于3.
- Client1调用MethodTwo()时,又会进入到SampleMethod构造函数产生新的实例,所以instanceId的值就会等于4.再次调用GetInstanceId()时,新的实例值又会增加1,所以客户端最终会输出5.而调用的操作计数器始终为0.
- 其实就是客户端每做一次调用操作,SampleMethod就会被实例化一次,由此我们可以查看到instanceId和OperationCount值的变化。
单例模式(Single)下的服务实例
- 在单调模式(single)中,WCF只会创建一个实例上下文来处理服务的所有请求调用对象,即 SampleMethod只会进行一次实例化。不管调用的请求对象是在同一个客户端还是在不同的客户端。

- 要检验单调模式(single),我们只需把服务行为的InstanceContextMode设置为single,重新编译工程后,运行结果如下:

- 运行结果说明:由于WCF采用单例模式只会生成一个实例化上下文,所以从运行的结果可以看到instanceId的值始终为1,而操作计数器OperationCount也在不断做累加,再经过Client1和Client2调用处理后,在MethodOne()和MethodTwo()做累加,所以最终的值为4.
会话模式(PerSession)下的服务实例
- 在会话模式(PerSession)中,WCF会对客户端与服务端的每一个会话通道创建一个实例上下文。即不同的客户端在各自的会话通道的实例上下文中处理请求对象。

- 要检验会话模式(PerSession),我们只需把服务行为的InstanceContextMode设置为PerSession,重新编译工程后,运行结果如下:

- 运行结果说明:从运行结果可以看出客户端实例Client1的调用所在的instanceId为1,操作计数器OperationCount经过两次的调用(调用MethodOne()和MethodTwo())后做累加,最后的值为2.客户端Client2调用的时候会产生新的实例上下文。所以instanceId的值为2,操作计数器OperationCount又会重新开始计数。

WCF初探-27:WCF中的实例化的更多相关文章
- WCF初探-28:WCF中的并发
理解WCF中的并发机制 在对WCF并发机制进行理解时,必须对WCF初探-27:WCF中的实例化进行理解,因为WCF中的并发特点是伴随着服务实例上下文实现的.WCF的实例上下文模型可以通过Instanc ...
- WCF初探文章列表
WCF初探-1:认识WCF WCF初探-6:WCF服务配置 WCF初探-2:手动实现WCF程序 WCF初探-7:WCF服务配置工具使用 WCF初探-3:WCF消息交换模式之单向模式 WCF初探-8:W ...
- WCF初探-26:WCF中的会话
理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...
- WCF初探-22:WCF中使用Message类(上)
前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...
- WCF初探-25:WCF中使用XmlSerializer类
前言 在上一篇WCF序列化和反序列化中,文章介绍了WCF序列化和反序列化的机制,虽然WCF针对序列化提供了默认的DataContractSerializer序列化引擎,但是WCF还支持其他的序列化引擎 ...
- WCF初探-6:WCF服务配置
WCF服务配置是WCF服务编程的主要部分.WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法.虽然WCF也提供硬编程的方式,通过在代码中直接设置相关对象的属性 ...
- WCF初探-2:手动实现WCF程序
1.前言 上一篇,我们通过VS自带的模板引擎自动生成了一个wcf程序,接下来我们将手动实现一个wcf程序.由于应用程序开发中一般都会涉及到大量的增删改查业务,所以这个程序将简单演示如何在wcf中构建简 ...
- WCF初探-9:WCF服务承载 (下)
在WCF初探-8:WCF服务承载 (上)中,我们对宿主的概念.环境.特点做了文字性的介绍和概括,接下来我们将通过实例对这几种寄宿方式进行介绍.为了更好的说明各寄宿环境特点,本实例采用Http和net. ...
- WCF初探-10:WCF客户端调用服务
创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...
随机推荐
- Windows光标形状
::SetCursor( LoadCursor(NULL, IDC_XXX) ); IDC_ARROW (plain) IDC_HELP (arrow + question mark) IDC_APP ...
- 让我们来简单说说mockjs吧!
背景: 新接手了一个更新CRM的客户管理项目,负责添加三张活动财务表与操作的模块,接到任务时候,后台还没有做数据,所以用到了假数据,So就是这里所说的mockjs. 介绍: mockjs让前端独立于后 ...
- Digital Roots
Background The digital root of a positive integer is found by summing the digits of the integer. If ...
- python re模块
re模块主要用于查找.替换.分割 print(re.__doc__) 特殊字符(元字符): "." 任意一个字符,除换行符(\n) "^" 字符串开头 &quo ...
- Python -- 数据加载、存储与文件格式
标签(空格分隔): Python 读入读出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据,利用Web API操作网络资源. 读写文本格式的数据 pandas提供了一 ...
- Cocos2d-x 核心概念 - 坐标系(UI.OpenGL.世界坐标系.模型坐标系)
UI坐标系与OpenGL坐标系 UI坐标就是Android和IOS等应用开发时候使用的二维坐标系,原点在左上角 OpenGL坐标是三维坐标,由于Cocos2d-x Lua 底层采用OpenGL渲染,因 ...
- js 求点到直线的距离(由2点确定的直线,求到第三点的距离)
需要用到2个数学公式 1,已知2点求其直线方程 2,点到直线的距离 1,Y=kX+b 分别将两点带入以上方程,求出k 和b 例如: p0={x:?,y:?}, p1={x:?,y:?} 可解得方程: ...
- [bzoj1122][POI2008]账本BBB
1122: [POI2008]账本BBB Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 402 Solved: 202[Submit][Status ...
- iOS - Localizable 国际化
1.国际化 开发的移动应用更希望获取更多用户,走向世界,这就需要应用国际化,国际化其实就是多语言,系统会根据当前设备的语言环境来识别 App 中使用中文还是英文. 2.应用内容国际化 1.新建一个名为 ...
- 工作中最常用的Excel函数公式大全
电脑那些事儿2016-05-18 22:23:02微软 公式 工作阅读(22574)评论(1) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 Wo ...