那些年,我们一起学WCF--(6)PerCall实例行为
当客户端调用服务器端服务后,服务器端就会为客户端生成一个实例,关于服务实例的分配问题,在WCF中有专门的属性进行设置,可以让所有客户端共享一个实例,
也可以让一个客户端可以拥有多个实例,也可以让一个实例只能被客户端使用一次。
关于实例的分配和使用范围,在WCF通过服务行为的InstanceContextMode枚举进行设置.InstanceContextMode有三种枚举类型
PerSession=0 会话实例,此为默认值
PerCall=1
Single=2
接下来我们看下这三种策略的使用方法
1.PerCall实例
PerCall实例策略是指WCF为每个客户端的每一次请求,都会生成一个新的服务实例,各个实例不会相互影响,客户端调用结束后,服务器端立刻销毁该实例.
下面的这段代码演示了PerCall实例的实现,在服务器端的契约实现实现上用InstanceContextMode.PerCall标记为实例策略,
服务器端契约实现每调用一次AddCount方法,变量num的值会加1,当客户调用方法执行完毕的时候,会通过Dispose方法释放当前实例。
通过这个例子,我们可以看到,在客户端的服务代理调用两次AddCount方法,但是变量num的值没有改变,两次输出的值都是1
- [ServiceContract]
- publicinterface IPerCall
- {
- [OperationContract]
- int AddCount();
- }
- [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
- publicclass PerCallImpl:IPerCall,IDisposable
- {
- privateint num = 0;
- publicint AddCount()
- {
- num =num + 1;
- Console.WriteLine("当前值:"+num.ToString()+",时间:"+DateTime.Now.ToString());
- return num;
- }
- publicvoid Dispose()
- {
- Console.WriteLine("实例释放");
- Console.WriteLine("---------");
- }
[ServiceContract]
public interface IPerCall
{
[OperationContract]
int AddCount();
} [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class PerCallImpl:IPerCall,IDisposable
{
private int num = 0;
public int AddCount()
{
num =num + 1;
Console.WriteLine("当前值:"+num.ToString()+",时间:"+DateTime.Now.ToString());
return num;
} public void Dispose()
{
Console.WriteLine("实例释放");
Console.WriteLine("---------");
}
启动服务器端,服务器端宿主是一个控制台应用程序
- ServiceHost host = new ServiceHost(typeof(PerCallImpl));
- host.Open();
- Console.WriteLine("服务器端启动...");
- Console.ReadLine();
ServiceHost host = new ServiceHost(typeof(PerCallImpl));
host.Open();
Console.WriteLine("服务器端启动...");
Console.ReadLine();
在客户端,我们生成一个服务器端实例,同一个实例,调用服务器端的同一个方法两次,计数器的结果是一样的。
- privatevoid button1_Click(object sender, EventArgs e)
- {
- ChannelFactory<IPerCall> channelFactory = new ChannelFactory<IPerCall>("WSHttpBinding_IPerCall");
- IPerCall apple = channelFactory.CreateChannel();
- //同一个客户端实例调用AddCount方法两次,输出的结果一样
- apple.AddCount();
- apple.AddCount();
- }
private void button1_Click(object sender, EventArgs e)
{
ChannelFactory<IPerCall> channelFactory = new ChannelFactory<IPerCall>("WSHttpBinding_IPerCall");
IPerCall apple = channelFactory.CreateChannel();
//同一个客户端实例调用AddCount方法两次,输出的结果一样
apple.AddCount();
apple.AddCount();
}
效果图:
通过这个例子,我们可以看到PerCall的优缺点
1.客户端每发送一次请求,服务器都会生成一个新的服务实例,各个服务实例不会相互影响,每次调用都可以看作一个单独的线程,不用考虑线程冲突的问题。不会产生并发性.
2.服务器端在客户端调用完毕后,就立刻释放服务实例,这样提高了服务器的使用率,在不用的时候立刻被释放,增加了系统的吞吐量,提高了服务器的使用率.
缺点:
假设我们要从数据库查询大数据量数据,每次调用查询的数据都是一样的,这是一个很耗时的过程,如果使用PerCall模式每次调用服务器端的方法都要查询一次数据,这样就增加了调用执行时间,客户端等待的时间就会过长,影响了客户端执行效率。这时候PerCall模式的弊端就暴露出来了,两次查询的数据不能共享。
对于这种问题,我们可以采用缓存进行解决,也可以使用其他实例行为进行解决,在下节我们看下其他实例行为。
demo下载:http://download.csdn.net/detail/zx13525079024/4596356
那些年,我们一起学WCF--(6)PerCall实例行为的更多相关文章
- 跟我一起学WCF(13)——WCF系列总结
引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ ...
- [老老实实学WCF] 第八篇 实例化
老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...
- 跟我一起学WCF(11)——WCF中队列服务详解
一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务队列的方法来支持客户端 ...
- 跟我一起学WCF(8)——WCF中Session、实例管理详解
一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...
- [老老实实学WCF] 第十篇 消息通信模式(下) 双工
老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双 ...
- [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向
老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...
- [老老实实学WCF] 第七篇 会话
老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高 ...
- [老老实实学WCF] 第六篇 元数据交换
老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个 终结点上建立通道从而进 ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- [老老实实学WCF] 第四篇 初探通信--ChannelFactory
老老实实学WCF 第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了. ...
随机推荐
- 15个你不知道的杀手级Google Chrome功能
之前写过一篇我为什么使用Google Chrome浏览器,算是在使用了一段时间的Google Chrome后的一点粗浅认识,最近读到一篇文章15 Killer Google Chrome Featur ...
- leetcode面试准备:Count Complete Tree Nodes
1 题目 Given a complete binary tree, count the number of nodes. In a complete binary tree every level, ...
- perl 获取虚拟机信息
[root@master ~]# cat simple_flow.pl ! /usr/bin/perl -w use strict; use warnings; 导入 vSphere SDK for ...
- 利用row_number over 函数删除重复记录
开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行 SQ ...
- Apache Hadoop RPC Authentication 安全绕过漏洞
漏洞名称: Apache Hadoop RPC Authentication 安全绕过漏洞 CNNVD编号: CNNVD-201308-425 发布时间: 2013-08-28 更新时间: 2013- ...
- once
var once = function(obj, evtType, handler) { var f = function() { //console.log(arguments) handler.a ...
- 【传】玩转Android---UI篇---ImageButton(带图标的按钮)
原文网址:http://hualang.iteye.com/blog/964049 除了Android系统自带的Button按钮一万,还提供了带图标的按钮ImageButton 要制作带图标的按钮,首 ...
- 两个月淘宝刷单,连续死N次血泪史 (转)
两个月淘宝刷单,连续死N次血泪史 派代网 2014/10/13 刷单 分享到:3 [思路网注] 看来是靠刷流量刷销量是行不通了,点击率与展现无法匹配,这是致命的!!那么,贵就贵点,直通车来吧!!再删宝 ...
- HTMLTestRunner生成空白resault.html
发现一奇葩问题,用idle或pyscripter执行脚本,生成的是空白html,通过cmd,进入脚本目录执行python xx.py,却能生成测试报告. HTMLTestRunner 例子 #codi ...
- 走过而立之年的Coder
当年,关于“程序员三十”的话题,一直充斥在耳边——大抵就是:Coder过了三十就完犊子了.干不下去了.对于新人来讲,这个话题的热度,甚至超过了语言之争的月经贴. 那些话题总结一下,大抵就是如下几种: ...