WCF实例管理的三种方式
很多情况下,我们都需要控制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实例管理的三种方式的更多相关文章
- Kubernetes 对象管理的三种方式
Kubernetes 中文文档 1. Kubernetes 对象管理的三种方式对比 Kubernetes 中的对象管理方式,根据对象配置信息的位置不同可以分为两大类: 命令式:对象的参数通过命令指定 ...
- Spring事务管理的三种方式
一 .第一种:全注解声明式事务 Xml代码 复制代码 收藏代码 .<?xml version="1.0" encoding="UTF-8"?> .& ...
- Java Class类以及获取Class实例的三种方式
T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>. publi ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- 获得 LayoutInflater 实例的三种方式
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- [转]获得 LayoutInflater 实例的三种方式
转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式 在实际开 ...
- Spring bean管理器 bean实例化的三种方式
bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.Us ...
- 【Spring】的【bean】管理(XML配置文件)【Bean实例化的三种方式】
Bean实例化的三种方式 说明:通过配置文件创建对象就称为Bean实例化. 第一种:使用类的无参构造创建(重点) 实体类 package com.tyzr.ioc; public class User ...
- 【转】实现展开列ExpandableListView的三种方式之SimpleExpandableListAdapter实例
原文网址:http://blog.csdn.net/x605940745/article/details/12099709 实现可扩展展开列ExpandableListView的三种方式 欢迎加入QQ ...
随机推荐
- JAVA四种线程池实例
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java 1 2 3 4 5 6 7 new Thread(new Runnable() { ...
- js学习笔记一-语法结构
js是区分大小写的,关键字.变量.函数名和所有的标识符都必须采取统一一致的大小写形式. js定义了unicode转义序列,以\u开头,其后跟随四个十六进制数,可以在字符串直接量.正则表达式直接量和标识 ...
- Selenium 入门
我本身也是一个初学者,就顺手记录一下自己的成长记录,共勉 1, 登录selenium官方网站,download 相关的插件. http://docs.seleniumhq.org/ 我用的是eclip ...
- MySQL监控工具-orztop
先安装orzdba,链接:http://blog.itpub.net/28939273/viewspace-1875895/ 安装依赖的包:[root@hank-yoon servers]# yum ...
- intellij 设置-试验过的
1.已修改的文件星号“*”标记 2.在PROJECT窗口中快速定位,编辑窗口中的文件 在编辑的所选文件按ALT+F1, 然后选择PROJECT VIEW 3.改变编辑文本字体大小 FILE -> ...
- iOS JSON解析
解析json成dic对象 -(void)fetchedData:(NSData*)responseData {//parse out the json dataNSError* error; NSDi ...
- iOS网络编程同步GET方法请求编程
iOS SDK为HTTP请求提供了同步和异步请求两种不同的API,而且可以使用GET或POST等请求方法.我们先了解其中最为简单的同步GET方法请求. 首先实现查询业务,查询业务请求可以在主视图控制器 ...
- Java Day 06
二维数组 定义: 格式1 int[][] arr = new int[3][2]; 格式2 int[][] arr = new int[3][];//每个一维数组初始化时为null 空指针异常 格式3 ...
- C#中使用SelectionStart属性指定输入框光标位置
今天工作中遇到一个小BUG需要修改,需求为在文本框输入的过程中,如果数字是以0开头则自动消除0 如输入012,则显示12 很容易想到在textbox的text changed事件中判断,如果text是 ...
- 20145120 《Java程序设计》第1周学习总结
20145120 <Java程序设计>第1周学习总结 教材学习内容总结 刚刚开始学习java,感觉还十分陌生,在第一周的学习中,我知道了java的历史,JVM.JRE和JDK是什么等各种知 ...