很多情况下,我们都需要控制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服务对象实例化基础的更多相关文章
-
WCF分布式开发步步为赢(1):WCF分布式框架基础概念
众所周知,系统间的低耦合一直是大型企业应用系统集成追寻的目标,SOA面向服务架构的出现为我们的如何利用现有企业系统资源进行企业ERP系统设计和实现提供了重要的参考原则.SOA如此炙手可热,各大厂商都推 ...
-
WCF 学习系列——WCF的学习基础
这个系列的博客由WCF4 高级编程学习记录,如有错误请指正. 首先介绍一些概念: SOA: (Service-Oriented Architecture 面向服务架构),一种架构方法,也是一种编程模式 ...
-
WCF服务编程-基础
WCF是微软建立新一代的分布式应用及面向服务应用的标准平台,是基于原有.NET Framework 2.0的扩展.虽然在WCF发布不久就已经在项目中使用WCF技术了.但是由于在项目中还没有较大规模的应 ...
-
WCF实例管理的三种方式
很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间. Wcf框架提供了三种创建wcf实例的方式. WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将 ...
-
WCF入门教程:WCF基础知识问与答(转)
学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...
-
WCF基础教程——vs2013创建wcf应用程序
引言 近期在项目中见到了师哥们常常谈到的WCF这方面的知识.当时在写程序的时候也没有理解wcf究竟是个什么东西? 以及我们为什么在项目中会採用这种框架来实现,仅仅是依照师哥他们写好的代码编写同样格 ...
-
.NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序
.NET 跨平台RPC框架DotNettyRPC DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...
-
【WCF】基址与默认终结点
五月份的时候,有位老友给老周提了个建议:希望老周写一写WCF的文章.其实老周以前是写过WCF的文章的,只是不是写在这个博客里,老周并不打算把X年前的博客导进来,要写的话,重新写吧.毕竟,那个时候写的文 ...
-
WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解
上一节<WCF分布式框架基础概念>我们介绍了WCF服务的概念和通信框架模型,并给出了基于自定义托管服务的WCF程序的实现代码.考虑到WCF分布式开发项目中关于托管宿主服务配置和客户端添加引 ...
随机推荐
-
安装mysql步骤
1.yum install lrzsz 安装上传功能2.查看系统是否装有MySql :rpm -qa | grep mysql3.查看系统Mysql位置 :whereis mysql4.卸载Mysq ...
-
百度上传android包:应用名解析失败!
manifest 里面<application增加android:label="@string/app_name"
-
写一个函数,将一个int型的数组做为参数传入,使用指针返回两个结果:最大值和最小值
今日下午研究了一下c语言中的指针问题,c语言的核心是指针,指针的核心是地址,地址的核心是内存. #include <stdio.h> void hanshu(int *arry,int s ...
-
关于HttpClient重试策略的研究
一.背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信.对于交易类的接口,订单状态是至关重要的. 这就牵扯到一系列问题: HttpClient是否有默认 ...
-
Windows 2008 r2上安装MySQL
用MSI安装包安装 根据自己的操作系统下载对应的32位或64位安装包.按如下步骤操作: MySQL数据库官网的下载地址http://dev.mysql.com/downloads/mysql,第一步: ...
-
C语言中关键字restrict的概念,使用范围,例子
概念: restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容. 渊源: res ...
-
网络流量状态命令总结 (含notp安装)
1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众多统计数据.其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收 ...
-
PHP_CodeSniffer 使用攻略
安装 PHP_CodeSniffer 安装 phpcs phpcs 是 PHP 代码规范的检测工具. # 下载 $ curl -OL https://squizlabs.github.io/PHP_C ...
-
python网络编程-socketserver
一:socketserver简化了网络服务器的编写. 它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer. 这4个类是同步进行处 ...
-
Python实现二叉树的遍历
二叉树是有限个元素的集合,该集合或者为空.或者有一个称为根节点(root)的元素及两个互不相交的.分别被称为左子树和右子树的二叉树组成. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉 ...