当发生一次WCF请求-响应操作时,会经过如下几个步骤

  1. WCF Client想WCF Server发送一个服务请求
  2. WCF Server创建WCF服务对象
  3. 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模式

在这种模式下,每个会话对应一个服务对象,会话结束后服务对象被回收。也就是说:

  1. 同一个客户端的所有调用都发送给同一个服务对象
  2. 不同的客户端的调用发送给不同的服务对象

在这种方式下,每一个客户端都是独立计数的。

[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入门(十)——服务对象模型的更多相关文章

  1. 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代码方式来 ...

  2. WCF入门教程(四)通过Host代码方式来承载服务

    WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...

  3. WCF入门教程(三)定义服务协定--属性标签

    WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...

  4. WCF入门教程(二)如何创建WCF服务

    WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...

  5. WCF入门教程(二)从零做起-创建WCF服务

    通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...

  6. WCF入门(三)---WCF与Web服务/Web Service

    下面列出了WCF和Web服务之间存在一些重大差异. 属性:WCF服务是通过定义ServiceContract和OperationContract属性,而在Web服务,WebService和WebMet ...

  7. 【WCF】无废话WCF入门教程

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  8. 无废话WCF入门教程一[什么是WCF]

    http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html wcf技术交流,同学习共进步,欢迎加群:  群号:3981831 ...

  9. WCF入门教程一[什么是WCF]

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  10. WCF入门教程一[什么是WCF]--转载只为学习收藏

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

随机推荐

  1. s:if 标签用法总结和举例

    http://www.360doc.com/content/11/1108/18/6161903_162838014.shtml

  2. 小程序 wx.request ajax示例

    简单示例 https://developers.weixin.qq.com/miniprogram/dev/api/network-request.html wx.request({ method: ...

  3. scrapy添加 请求头

    直接在 setting 文件中添加

  4. elipse快捷键大全 elipse快捷键详解

    1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...

  5. CentOS 5.5 下修改Apache默认端口80

    打开  /etc/httpd/conf/httpd.conf  文件 修改两个地方     #Listen 12.34.56.78:80     Listen 80 #把80改为你设置的端口,我设置端 ...

  6. DPDK 全面分析

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 高性能网络技术 ...

  7. sqlzoo练习答案--SUM and COUNT

    World Country Profile: Aggregate functions This tutorial is about aggregate functions such as COUNT, ...

  8. HotSpot模板解释器目标代码生成过程源码分析

    虽然说解释执行模式是逐字逐句翻译给目标平台运行的,但这样的过程未免太过缓慢,如果能把字节码说的话做成纸条,运行时只要把对应的纸条交给目标平台就可以了,这样,执行速度就会明显提升.JVM的Hotspot ...

  9. How to Install Xcode, Homebrew, Git, RVM, Ruby & Rails on Snow Leopard, Lion, Mountain Lion, and Mavericks

    After following many outdated and incomplete instructions for setting up a web development environme ...

  10. 04、Quick Start for Windows

    创建一个新工程 1.在 VS 上,选择 File > New > Project.. 2.在新工程窗口,选择  Visual C# > Windows Store > Blan ...