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服务对象实例化基础的更多相关文章
- 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分布式开发项目中关于托管宿主服务配置和客户端添加引 ...
随机推荐
- ZOJ 3761 Easy billiards 月赛E DFS
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3761 题目大意:给定n个位置的小球,小球的运动方向只能是水平或者 ...
- zabbix oracle监控插件orabbix部署安装
1,下载orabbix插件包(插件包同时满足在大部分POSIX-linux及unix和大部分版本的windows下运行,玩转类似但不等同于Tomcat) wget http://www.smartma ...
- Java GC专家系列1:理解Java垃圾回收
了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌 ...
- Hadoop Hive概念学习系列之什么是Hive?(一)
参考 <Hadoop大数据分析与挖掘实战>的在线电子书阅读 http://yuedu.baidu.com/ebook/d128cf8e33687e21 ...
- svn操作
1.已经被svn管理的文件的复制.删除.重命名都要通过svn的命令来操作(在资源管理器中通过鼠标右键来完成)(复制粘贴可以通过右键按下移动来实现) 2.没有被svn管理的文件(没有被上传过的文件,没有 ...
- mysql in查询 结果乱序 引发的思考
Mysql in查询 结果集 乱序 SQL: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按1,2,3,4, ...
- 使用php将数组转为XML
<?php class Array_to_Xml { private $version = '1.0'; private $encoding = 'UTF-8'; private $root = ...
- JAVA wait(), notify(),sleep详解
转自: http://blog.csdn.net/zyplus 在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过synchronized()来实现的,需要说明的是, ...
- 去除android ImageView “[Accessibility] Missing contentDescription attribute on image” warning
1.在有警告的xml上选择Graphical Layout: 2.查看右上角的被涂鸦的地方,然后点击: 3.出现: 4.点击”Ignore Type“或者是“Disable Issue Type”(不 ...
- linux进程调度之 FIFO 和 RR 调度策略---SYSTEMTAP
http://blog.chinaunix.net/uid-24774106-id-3379478.html http://blog.chinaunix.net/uid-24774106-id-337 ...