WCF入门(十)——服务对象模型
当发生一次WCF请求-响应操作时,会经过如下几个步骤
- WCF Client想WCF Server发送一个服务请求
- WCF Server创建WCF服务对象
- WCF Server调用WCF服务对象接口,将结果返回给WCF客户端。
操作过程中就牵涉到了服务对象的创建,但由于WCF服务对象是WCF框架管理,一般的时候并不关注它何时创建,何时回收。对于无需访问成员变量的状态无关的服务来说,这个并不影响我们的功能实现。
但是,许多时候我们也需要提供与状态相关的服务,这个时候需要通过服务对象的成员变量来保存状态。此时,我们就需要关注WCF的服务对象的创建策略了。下面就以一个计数器为例,介绍一下不同的策略对服务结果的影响。
[ServiceContract]
public interface IService1
{
[OperationContract]
int Increment();
}
[ServiceBehavior]
public class Service1 : IService1
{
private int intCounter;
public int Increment()
{
intCounter++;
return intCounter;
}
}
一般来讲,我们有如下三种策略创建WCF对象:
- PerCall 每次WCF服务调用都创建一个新的WCF服务对象,
- PerSession 每个WCF会话期间只创建一个WCF服务对象,如果没有会话设置,则效果同PerCall(默认策略)
- Single 所有WCF会话共享一个WCF服务对象
这三种策略可以ServiceBehavior在中通过InstanceContextMode显式设置。
ServiceBehavior(public class Service1 : IService1
注意:由于如果会话没有启用的话的话,PerSession效果同PerCall,而默认的协议basicHttpBinding不支持会话,为了正确演示这个示例,请将协议绑定到wsHttpBinding。
PerCall模式:
在这种方式下,每次WCF服务调用都创建一个新的WCF服务对象,调用完请求后,该对象便进入可回收状态。

在这种方式下,无论客户端如何调用,由于每次都是创建新对象,则计数永远都是1
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1 : IService1
{
}

PerSession模式
在这种模式下,每个会话对应一个服务对象,会话结束后服务对象被回收。也就是说:
- 同一个客户端的所有调用都发送给同一个服务对象
- 不同的客户端的调用发送给不同的服务对象

在这种方式下,每一个客户端都是独立计数的。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Service1 : IService1
{
}

Single模式
在这种模式下,所有会话都对应同一个服务对象。

这个方式下,所有的客户端的计数都会被累加起来。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service1 : IService1
{
}

服务对象生命周期和Dispose
虽然我们通过InstanceContextMode控制服务对象的生命周期,但是我们也无法得之服务对象何时释放。一般情况下,这个确实无需关心,但是,如果服务对象中如果在成员变量中保存了资源,我们就得需要确保资源能够及时释放。
按照.net设计原则,如果成员中保存了资源,则需要实现IDisposable接口,然后再Dispose方法中释放资源。实际上,在WCF中也是遵循这个规则的:对于实现了IDisposable接口的服务对象,在该对象生命周期结束后,就会调用其Dispose方法以确保及时释放资源。也就是说,只要我们的实现符合基础的设计准则,WCF框架自动及时释放。
活用一下这个规则:我们可以利用Dispose方法感知会话模式下成员的下线。
三种方式的比较
从性能上来看,Single模式全局只创建一个对象,开销最小。而PerCall每次调用都创建一个对象,看起来开销最大,但是它的可扩展性是最好的,非常容易实现负载分担,并且资源释放最为及时。
从功能上来看,PerSession和面向对象的模式最为接近,实现各种复杂的逻辑更为容易。
WCF入门(十)——服务对象模型的更多相关文章
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- WCF入门教程(四)通过Host代码方式来承载服务
WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...
- WCF入门教程(三)定义服务协定--属性标签
WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...
- WCF入门教程(二)如何创建WCF服务
WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...
- WCF入门教程(二)从零做起-创建WCF服务
通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...
- WCF入门(三)---WCF与Web服务/Web Service
下面列出了WCF和Web服务之间存在一些重大差异. 属性:WCF服务是通过定义ServiceContract和OperationContract属性,而在Web服务,WebService和WebMet ...
- 【WCF】无废话WCF入门教程
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- 无废话WCF入门教程一[什么是WCF]
http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html wcf技术交流,同学习共进步,欢迎加群: 群号:3981831 ...
- WCF入门教程一[什么是WCF]
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- WCF入门教程一[什么是WCF]--转载只为学习收藏
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
随机推荐
- scanf深究
例子: #include <stdio.h>#include <string.h> main(){ char buffer[1024]; scanf("%s" ...
- 温度测量【RTD】
原理 温度是表征物体冷热程度的物理量,它可以通过物体随温度变化的某些特性(如电阻.电压变化等特性)来间接测量,通过研究发现,金属铂(Pt) 的阻值跟温度的变化成正比,并且具有很好的重现性和稳定性,利用 ...
- IBM websphere MQ 消息发送与获取
一. 所需依赖包,安装 IBM websphere MQ 后,在安装目录下的 java 目录内 import java.io.IOException; import java.util.Propert ...
- Sphider + SCWS 打造完美PHP中文搜索引擎
今日需要为几个网站做个全文搜索引擎,找了几个PHP开源项目,先试了一下Sphinx ,可惜是基于数据库的,相当于数据库搜索的扩展.Sphider还不错,不过中文的分词不行,基本只能靠空格和符号进行分词 ...
- Python正则表达式中的re.S的作用
在Python的正则表达式中,有一个参数为re.S.它表示“.”(不包含外侧双引号,下同)的作用扩展到整个字符串,包括“\n”.看如下代码: import re a = '''asdfhellopas ...
- 客户端在向服务器的动态页发出请求的时候,服务器才会创建session
注意,纯的HTML页面很有可能导致服务器不会为用户创建session,即便是新到的用户也是如此. 在某些情况下也可能与服务器的具体配置有关系. 尤其是在对session进行监听的时候要注意这一点.
- location.href 不响应的解决方法
在某些时候修改元素的值的时候过快会导致失效 1.window.open("","_blank") 代替 不过也是打开新窗口 2.延迟调用location.hr ...
- cocos2dx3.2升级Android5的坑
虽然已经转到服务端,但是对客户端的事情,偶尔还看看.公司的游戏用的是cocos2dx 3.2的版本, 然而在Android 5 上却无法运行. 先是没有触摸事件. 在stackoverflow上看到, ...
- java ssm框架入门(二)添加语言滤器
使用过滤器是在web.xml中使用filter,以下是码过滤器,过滤所有资源的使用 web.xml <filter> <filter-name>setCharactor< ...
- fastjson常用操作
一. fastjson生成json字符串(JavaBean,List<JavaBean>,List<String>,List<Map<String,Object&g ...