那些年,我们一起学WCF--(7)PerSession实例行为
这一节,大家了解下PerSession实例行为,PerSession表示会话实例行为,当客户端调用服务器后,服务器端会为客户端分配一个新的服务实例,这个实例在服务器端SESSION时间过期后将失效。客户端每调用一次服务,在客户端生成一个新的代理实例,都会产生一个新的会话。
PerSession实例行为有点类似于ASP.NET中的session,但又些不同.
在WCF中使用PerSession实例,需要手动设置行为
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)], 默认情况下,WCF的实例行为为PerSession
在WCF中,并不是所有通信协议都可以使用PerSession实例行为的,只有支持会话的通信协议才可以使用PerSession实例,如:NetTcpBinding, NetNamePipeBinding,
wsHttpBinding, wsFederationHttpBinding,wsDualHttpBinding.
1.PerSession设置
我们看下代码中怎样设置 persession实例行为。服务器端契约和行为设置
在契约实现上设置实例行为,在契约上设置会话模式.
- [ServiceContract(SessionMode=SessionMode.Allowed)]
- public interface IPerSession
- {
- [OperationContract]
- int AddCountBySession();
- }
- [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
- publicclass PerSessionImpl:IPerSession,IDisposable
- {
- privateint num;
- /// <summary>
- /// 通过 Session模式的方法调用
- /// </summary>
- /// <returns></returns>
- publicint AddCountBySession()
- {
- num = num + 1;
- Console.WriteLine("当前值:"+num.ToString()+",时间:"+DateTime.Now.ToString());
- return num;
- }
- publicvoid Dispose()
- {
- Console.WriteLine("释放实例");
- }
- }
[ServiceContract(SessionMode=SessionMode.Allowed)]
public interface IPerSession
{
[OperationContract]
int AddCountBySession();
} [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class PerSessionImpl:IPerSession,IDisposable
{
private int num;
/// <summary>
/// 通过 Session模式的方法调用
/// </summary>
/// <returns></returns>
public int AddCountBySession()
{
num = num + 1;
Console.WriteLine("当前值:"+num.ToString()+",时间:"+DateTime.Now.ToString());
return num;
} public void Dispose()
{
Console.WriteLine("释放实例");
}
}
客户端调用1
- privatevoid button2_Click(object sender, EventArgs e)
- {
- //PerSession调用方式
- ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>("WSHttpBinding_IPerSession");
- IPerSession client = channelFactory.CreateChannel();
- //同一个客户端实例调用AddCount方法两次,输出的结果一样
- client.AddCountBySession();
- client.AddCountBySession();
- }
private void button2_Click(object sender, EventArgs e)
{
//PerSession调用方式
ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>("WSHttpBinding_IPerSession");
IPerSession client = channelFactory.CreateChannel();
//同一个客户端实例调用AddCount方法两次,输出的结果一样
client.AddCountBySession();
client.AddCountBySession();
}
在上面的客户端调用代码,我们同一个实例调用了两次方法,此时发现服务器端变量的值出现递增,这是因为这两次调用在同一个会话内。
我们多次点击按钮,会发现每次点击,服务器端的变量值都是从1开始递增,这是因为每次点击按钮都创建了一个新的代理实例,相当于创建了一个新的会话。
执行结果如下:

我们可以这样理解一个会话,在客户端每生成一个代理实例,就算一个会话,例如上面的 IPerSession client = channelFactory.CreateChannel();实例,就是一个会话,
所以调用了AddCountBySession方法两次,出现变量值递增的情况。
客户端调用2
接下来,我们在客户端启动的时候,创建一个全局实例变量。这样连续单击按钮执行多次,服务器端的变量值一直会递增,因为多次执行都是在一个会话内完成的
- privatevoid Form1_Load(object sender, EventArgs e)
- {
- ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>("WSHttpBinding_IPerSession");
- Sessionclient = channelFactory.CreateChannel();
- }
- IPerSession Sessionclient;
- privatevoid button3_Click(object sender, EventArgs e)
- {
- //定义一个全局session实例,进行调用
- Sessionclient.AddCountBySession();
- }
private void Form1_Load(object sender, EventArgs e)
{
ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>("WSHttpBinding_IPerSession");
Sessionclient = channelFactory.CreateChannel();
} IPerSession Sessionclient;
private void button3_Click(object sender, EventArgs e)
{
//定义一个全局session实例,进行调用
Sessionclient.AddCountBySession();
}
执行结果如下
以上代码我们创建了一个全局实例,多次点击按钮执行,服务器端变量值在同一个会话期内一直递增。
2.Session时效设置
PerSession模式的会话时间是有限制的,我们可以手动设置session的会话时间,一旦超过了session的有效时间,session会自动释放。
可以在服务器端的配置文件中的绑定设置中设置会话时间。
receiveTimeout="00:00:20" 表示会话时间为20秒,一旦超时,服务器就会关闭会话。
配置文件如下
- <bindings>
- <wsHttpBinding>
- <binding name="WSHttpBinding_IPerSession" closeTimeout="00:01:00"
- openTimeout="00:01:00" receiveTimeout="00:00:20" sendTimeout="00:02:00"
- bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
- maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
- messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
- allowCookies="false">
- <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
- maxBytesPerRead="4096" maxNameTableCharCount="16384" />
- <reliableSession ordered="true" inactivityTimeout="00:10:00"
- enabled="false" />
- <security mode="Message">
- <transport clientCredentialType="Windows" proxyCredentialType="None"
- realm="" />
- <message clientCredentialType="Windows" negotiateServiceCredential="true"
- algorithmSuite="Default" />
- </security>
- </binding>
- </wsHttpBinding>
- </bindings>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IPerSession" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:00:20" sendTimeout="00:02:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
通过以上的例子,我们知道Persession的优缺点
1.通过persession可以设置会话的有效期,保证服务实例在一定范围内可以重复利用。
缺点:
1.使用session模式,服务器不能被合理的利用,客户端调用完后,实例不能立刻释放。增加了服务器的压力。
demo:http://download.csdn.net/detail/zx13525079024/4596356
那些年,我们一起学WCF--(7)PerSession实例行为的更多相关文章
- 跟我一起学WCF(13)——WCF系列总结
引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ ...
- [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向
老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...
- [老老实实学WCF] 第七篇 会话
老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高 ...
- [老老实实学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] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- [老老实实学WCF] 第四篇 初探通信--ChannelFactory
老老实实学WCF 第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了. ...
随机推荐
- 【UVA10765】Doves and bombs (BCC求割点后联通块数量)
题目: 题意: 给了一个联通无向图,现在问去掉某个点,会让图变成几个联通块? 输出的按分出的从多到小,若相等,输出标号从小到大.输出M个. 分析: BCC求割点后联通块数量,Tarjan算法. 联通块 ...
- 多线程操作中为什么使用while而不是if来做判断状态是否就绪
在多线程操作中,我们常常会遇到需要先判断信号量状态是否就绪,然后执行后续操作的场景.这里对状态的判断使用的是while而不是单线程下常用的if. 以下示例展示了一个简单的生产者-消费者模型:当队列满的 ...
- I2C读写时序
1. I2C写时序图: 注意:最后一个byte后,结束标志在第十个CLK上升沿之后: 2. I2C读时序图: 注意:restart信号格式:读操作结束前最后一组clk的最后一个上升沿,主机应发送NAC ...
- Java 语言中 Enum 类型的使用介绍
Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...
- Delphi Webservice 杂谈
用WebService来实现B2B集成的最大好处在于可以轻易实现互操作性 WebService可用基于XML的SOAP来表示数据和调用请求,并且通过HTTP协议来传输这些XML格式的数据,因为此时的调 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...
- effective C++ 读后笔记
首先不得不说侯捷翻译的书大部分我都很喜欢,因为侯捷本身是一名出色的C++技术专家.这本书讲的是C++如何高效的运行,我想要成为一名卓越的开发人员,代码的高效性是必不可少的.很多人的代码质量很差,即使能 ...
- java 23 种设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- Nearly prime numbers - SGU 113(素数)
题目大意:判断一个数是否是两个素数的乘积,如果是,输出Yes,否则No. 分析:先打表求出来一部分素因子,用素数对素数判定还是比较快的. 代码如下: ========================= ...
- hdoj 1950 Bridging signals【二分求最大上升子序列长度】【LIS】
Bridging signals Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...