当发生一次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. Cocos2d-x3.0 载入Cocostudio的UI后,button无法点击的解决方法

    原帖地址:http://blog.csdn.net/musicvs/article/details/28390617 近期发现不少朋友都遇到这个问题,用Cocostudio的UI编辑器创建好UI后,在 ...

  2. android的通知栏的实现

    package com.example.mynotification; import android.os.Bundle; import android.app.Activity; import an ...

  3. android VLayout 全面解析

    概述 前不久.阿里新开源了2个东西,Atlas和vlayout.今天我来介绍下vlayout的使用. 在介绍前,先抱怨两句,阿里放开源出来,感觉就是让我们这群人给他们找bug~~我曾遇到一个奇怪的问题 ...

  4. centos7下mysqldump+crontab自动备份数据库

    1.创建文件夹(存放备份数据) mkdir /bak mkdir /bak/mysqldata 2.编写脚本 vi /usr/sbin/bakmysql.sh 脚本内容如下 DATE=`date +% ...

  5. AutoFac文档3(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 服务类型,名称和键 同 ...

  6. Linux 进程资源用量监控和按用户设置进程限制

    每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...

  7. sql 记录

    INSERT INTO B([name],[info]) SELECT [name,'10'] FROM A 级联更新1:update tb1, tb2 set tb1.a=tb2.a,tb1.b=t ...

  8. [kernel]如何主动触发一次kernel panic

    Step1: echo 1 > /proc/sys/kernel/sysrq 或者如果不想每次运行上面的命令,可以echo "kernel.sysrq=1" >> ...

  9. 微信小程序 - IOS 仿饿了么"我的",下拉橡皮筋效果

    这个需求是在wepy交流群里有群友提到的. 一个小花样. 注册mixins /** * IOS专用 顶部下拉橡皮筋效果 * 安卓的Page在到达顶部的时候,不能继续下拉...略过 * * 效果见 饿了 ...

  10. kettle两表内链接的查询结果与sql语句的查询结果不符合?

    1.教师表输入 2.学生表 查 3.学生表中查出的教师id进行排序 5.教师表中查出的同样也对教师的id进行排序 6.进行左连接 总结: 进行连接的时候的关键是同样对教师的id进行先排序