很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间。

Wcf框架提供了三种创建wcf实例的方式。

WCF服务对象实例化基础

在普通的WCF请求和相应过程中,将产生下列活动:

  • WCF客户端向WCF服务端对象发起一个请求。
  • WCF服务端对象实例化
  • WCF服务实例响应请求并给客户端发送响应

在创建WCF服务端对象时有下列三种不同的方式

  • 为每个WCF客户端请求创建一个新的WCF服务端实例
  • 为每个WCF客户端会话只创建一个WCF实例
  • 所有的WCF客户端都使用一个全局的WCF服务端实例

针对上述场景,WCF提供了三种便捷方式

  • 每次调用
  • 每个会话
  • 单个实例

每次调用模式

当我们将WCF服务设置为每次调用模式时,在使用WCF代理客户端每次方法调用时都将产生新的服务端实例

  • WCF客户端第一次调用
  • 服务端为客户端的这个方法调用创建新的实例
  • WCF服务处理请求并向客户端发送应答,销毁服务实例,让gc来清理
  • 当客户端第二次调用了第二个方法时,创建了新的实例,处理请求,销毁实例

如何实现WCF的每次调用实例化模式

要指定实例化模式,我们需要在标签ServiceBehavior中提供InstanceContextMode的值。这个标签是放在Service类上的。如下列代码所示:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Percall)]

public class Service:IService

{

private int intCounter;

public int Increment()

{

intCounter++;

return intCounter;

}

}

假定在客户端两次调用该方法

ServiceReferrence1.ServiceClient obj=new ServiceReference1.ServiceClient();

MessageBox.Show(obj.Increment().ToString());

MessageBox.Show(obj.Increment().ToString());

此时,尽管我们调用了两次Increment方法,但是得到的结果都是'1'。换句话说,WCF服务实例在每次方法调用时都被重新创建了,所以这个值始终为1。

每次会话实例模式

很多时候,我们都需要在多个方法调用时或者针对一个特定的会话来维护状态。对于这样的场景,我们就需要将服务配置为每个会话模式。在每个会话模式时,

在一次会话的交互过程中将只创建一个WCF服务对象,过程如下:

  • 客户端创建WCF服务代理,进行方法调用
  • 创建一个服务实例来处理方法响应
  • 客户端在同一个会话中做一个或多个方法调用
  • 使用同一个服务实例来处理这些方法调用
  • 当客户端结束了它的活动时,销毁WCF实例,提供给gc来清理资源

如何实现会话实例模式

要将服务配置为每个会话模式,我们需要配置标签ServiceBehavior的InstanceContextMode对象的值设置为PerSession

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]

public class Service:IService

{

private int intCounter;

public int Increment()

{

intCounter++;

return intCounter;

}

}

在客户端,当使用如下代码时,在客户端最后的代码执行时,将得到'2'

ServiceReference1.ServiceClient obj=new ServiceReference1.ServiceClient();

MessageBox.Show(obj.Increment().ToString());

MessageBox.Show(obj.Increment().ToString());

单例模式

有时候我们也会创建一个全局WCF实例为所有的WCF客户端提供服务。要创建一个单例模式WCF服务,可采取如下方式:

WCF客户端向服务端发起一个请求

创建一个服务端实例来为请求服务。这个实例不会被销毁,而是持续为其他客户端请求服务

假如这时候,某个其他的客户端如Client2,请求了同一个方法调用

将使用这个唯一的服务实例(由Client1创建的)来为Client2提供服务。

如何实现单例模式

为实现单例模式,将InstanceContextMode设置为Single

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]

public class Service:IService

{

}

当你从不同的客户端发起请求时,这个Counter计数同样会增加。该Counter技术成为了一个全局变量

使用每次调用,每个会话,单例模式的选择依据

每次调用

无状态服务

  • 服务持有了大量资源时,如连接对象和大量的内存对象
  • 最主要的需求是可扩展,需要使用一个可扩展体系时
  • 在调用WCF函数时是在一个单线程模式时

每个会话

  • 你需要在多个WCF调用之间维护状态时
  • 扩大体系时?
  • 轻量级资源引用

单例

  • 想在你的WCF服务中共享全局数据
  • 不考虑扩展

WCF实例管理的三种方式的更多相关文章

  1. Kubernetes 对象管理的三种方式

    Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...

  2. Spring事务管理的三种方式

    一 .第一种:全注解声明式事务 Xml代码 复制代码 收藏代码 .<?xml version="1.0" encoding="UTF-8"?> .& ...

  3. Java Class类以及获取Class实例的三种方式

    T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>.   publi ...

  4. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  5. 获得 LayoutInflater 实例的三种方式

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  6. [转]获得 LayoutInflater 实例的三种方式

    转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式   在实际开 ...

  7. Spring bean管理器 bean实例化的三种方式

    bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.Us ...

  8. 【Spring】的【bean】管理(XML配置文件)【Bean实例化的三种方式】

    Bean实例化的三种方式 说明:通过配置文件创建对象就称为Bean实例化. 第一种:使用类的无参构造创建(重点) 实体类 package com.tyzr.ioc; public class User ...

  9. 【转】实现展开列ExpandableListView的三种方式之SimpleExpandableListAdapter实例

    原文网址:http://blog.csdn.net/x605940745/article/details/12099709 实现可扩展展开列ExpandableListView的三种方式 欢迎加入QQ ...

随机推荐

  1. linux常用命令收集(持续中)

    mv  :  既可以重命名,又可以移动文件或文件夹 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式中要重命名文件或目录的话也是 ...

  2. C#二维数组及其本质(转)

    C#中二维数组包含两类:二维数组和数据矩阵.(这是我个人分类法,我认为比较能反映本质). 如上图,是二维数组,横向为第一维度,纵向为第二维度,不同维度可以有不同长度. 如果去掉元素7,那么上图也可能是 ...

  3. self,parent,this区别

    我容易混淆public,private,protected,还容易混淆this,self这些东西.前面已经写了一篇关于public,private,protected博文了,下面来说一下this,se ...

  4. 非常实用的10个PHP高级应用技巧

    PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法.它可以比 CGI或者Perl更快速的执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML ...

  5. c#之反射总结

     1.了解什么事程序集 2.加载程序集 首先要加载需要加载的程序集,然后找到指定的类型,进而往下进行动态加载. 要加载的程序集中的内容: public class Class1:Person { pr ...

  6. OC面向对象继承关系和组合关系笔记

    继承关系是描述类和类之间的关系,两个类分别称为子类和父类,子类继承了父类,子类就拥有了父类的属性和方法: 继承的关系特点描述出来就是:** “是” **  (例如:学生类 是 人类) 组合关系描述的语 ...

  7. 活动 Activity 四种加载模式

    singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例.(注意是栈顶,不在栈顶照样创建新实例!) singleTas ...

  8. JavaScript高级---装饰者模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  9. JavaScript高级---组合模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  10. 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

    先写我的思路,没有用指针的做法.如果你用的是VC,把第六行去掉. #include<stdio.h> #include<stdlib.h> int main() { setvb ...