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分布式开发项目中关于托管宿主服务配置和客户端添加引 ...
随机推荐
- java多线程编程(2)交替输出数字和字母
mark一下,不停的看看notify和wait的没有理解 class Printer { int index=0; //输出奇数 public synchronized void printA(int ...
- runtime/KVO等面试题
整理中... 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中 ...
- Unit Test单元测试时如何模拟HttpContext
参考文章:http://blog.csdn.net/bclz_vs/article/details/6902638 http://www.cnblogs.com/PurpleTide/archive/ ...
- 在LaTeX里插入全页的pdf 分类: LaTex 2015-02-04 17:20 142人阅读 评论(0) 收藏
要帮女友排版毕业论文,需要插入封面,省时省力的方法就是把学校给的Word封面保存成PDF然后插入到Latex文档中. 首先添加下面的宏: \usepackage[final]{pdfpages} 然后 ...
- android 24 设置与桌面相同的action和category
设置与桌面相同的action和category 安卓系统桌面也是一个activity,安卓桌面的action和category是: <activity android:name="co ...
- 使用 Acegi 保护 Java 应用程序
第 1 部分: 架构概览和安全过滤器 Acegi Security System 是一种功能强大并易于使用的替代性方案,使您不必再为 Java 企业应用程序编写大量的安全代码.虽然它专门针对使用 Sp ...
- struts2 convention-plugin实现零配置
零配置并不是没有配置,而是通过约定大于配置的方式,大量通过约定来调度页面的跳转而使得配置大大减少.使得Action等配置不必写在Struts.xml中. convention-plugin的约定 1. ...
- nginx php7 配置 备用
yum install epel-* -y yum install -y wget unzip gcc gcc-c++ make zlib zlib-devel pcre pcre-devel lib ...
- 咱也玩玩Wordpress
博客暂时转移到了 -> www.zhyfzy.ga 域名改成.com啦 -> www.zhyfzy.com
- PHP 解决未定义变量报错
在PHP中 有时候会出现 Notice: Undefined index: sid in D:\Apache Group\Apache2\htdocs\php_mobile\mobile\chao\s ...