这一节,大家了解下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实例行为。服务器端契约和行为设置

在契约实现上设置实例行为,在契约上设置会话模式.

  1. [ServiceContract(SessionMode=SessionMode.Allowed)]
  2. public   interface IPerSession
  3. {
  4. [OperationContract]
  5. int AddCountBySession();
  6. }
  7. [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
  8. publicclass PerSessionImpl:IPerSession,IDisposable
  9. {
  10. privateint num;
  11. /// <summary>
  12. /// 通过 Session模式的方法调用
  13. /// </summary>
  14. /// <returns></returns>
  15. publicint AddCountBySession()
  16. {
  17. num = num + 1;
  18. Console.WriteLine("当前值:"+num.ToString()+",时间:"+DateTime.Now.ToString());
  19. return num;
  20. }
  21. publicvoid Dispose()
  22. {
  23. Console.WriteLine("释放实例");
  24. }
  25. }
[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

  1. privatevoid button2_Click(object sender, EventArgs e)
  2. {
  3. //PerSession调用方式
  4. ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>("WSHttpBinding_IPerSession");
  5. IPerSession client = channelFactory.CreateChannel();
  6. //同一个客户端实例调用AddCount方法两次,输出的结果一样
  7. client.AddCountBySession();
  8. client.AddCountBySession();
  9. }
   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

接下来,我们在客户端启动的时候,创建一个全局实例变量。这样连续单击按钮执行多次,服务器端的变量值一直会递增,因为多次执行都是在一个会话内完成的

  1. privatevoid Form1_Load(object sender, EventArgs e)
  2. {
  3. ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>("WSHttpBinding_IPerSession");
  4. Sessionclient = channelFactory.CreateChannel();
  5. }
  6. IPerSession Sessionclient;
  7. privatevoid button3_Click(object sender, EventArgs e)
  8. {
  9. //定义一个全局session实例,进行调用
  10. Sessionclient.AddCountBySession();
  11. }
        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秒,一旦超时,服务器就会关闭会话。

配置文件如下

  1. <bindings>
  2. <wsHttpBinding>
  3. <binding name="WSHttpBinding_IPerSession" closeTimeout="00:01:00"
  4. openTimeout="00:01:00" receiveTimeout="00:00:20" sendTimeout="00:02:00"
  5. bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
  6. maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
  7. messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
  8. allowCookies="false">
  9. <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
  10. maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  11. <reliableSession ordered="true" inactivityTimeout="00:10:00"
  12. enabled="false" />
  13. <security mode="Message">
  14. <transport clientCredentialType="Windows" proxyCredentialType="None"
  15. realm="" />
  16. <message clientCredentialType="Windows" negotiateServiceCredential="true"
  17. algorithmSuite="Default" />
  18. </security>
  19. </binding>
  20. </wsHttpBinding>
  21. </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实例行为的更多相关文章

  1. 跟我一起学WCF(13)——WCF系列总结

    引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ ...

  2. [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

    老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...

  3. [老老实实学WCF] 第七篇 会话

    老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高 ...

  4. [老老实实学WCF] 第八篇 实例化

    老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...

  5. 跟我一起学WCF(11)——WCF中队列服务详解

    一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务队列的方法来支持客户端 ...

  6. 跟我一起学WCF(8)——WCF中Session、实例管理详解

    一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...

  7. [老老实实学WCF] 第十篇 消息通信模式(下) 双工

    老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双 ...

  8. [老老实实学WCF] 第六篇 元数据交换

    老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个 终结点上建立通道从而进 ...

  9. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  10. [老老实实学WCF] 第四篇 初探通信--ChannelFactory

    老老实实学WCF 第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF的服务端-客户端模型,可以建立一个简单的WCF通信程序,并且可以把我们的服务寄宿在IIS中了. ...

随机推荐

  1. Linux下让tomcat显示图片(jdk1.4, tomcat4.0 或更高版本)

    1.步骤:修改$CATALINA_HOME/bin/catalina.sh文件($CATALINA_HOME是指tomcat安装目录),在原文件的40行新增如下内容即可CATALINA_OPTS=&q ...

  2. Node.js权威指南 (7) - 实现基于TCP与UDP的数据通信

    7.1 使用net模块实现基于TCP的数据通信 / 136 7.1.1 创建TCP服务器 / 136 7.1.2 socket端口对象 / 142 7.1.3 创建TCP客户端 / 151 7.1.4 ...

  3. Linux Shell编程(10)——引用变量

    当要引用一个变量的值时,一般推荐使用双引号.使用双引号除了变量名前缀($).后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符.用双引号时$仍被当成特殊字符,允许引用一个被双 ...

  4. activiti集成drools实验

    无代码,无真相. 网上的博客代码,都挺片段的.所以,我想找个现成的demo实验代码. 上github ------------------------------------------------- ...

  5. POI做题记录:第二届POI

    Trees Memory limit: 32 MB Trees occur very often in computer science. As opposed to trees in nature, ...

  6. 【转】VSync Count 垂直同步

    原文:http://blog.csdn.net/yesy10/article/details/7794556 Unity3D中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间.一直 ...

  7. java基础 (六)面向对象(一)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  8. codevs 1421 秋静叶&秋穣子(树上DP+博弈)

    1421 秋静叶&秋穣子   题目描述 Description 在幻想乡,秋姐妹是掌管秋天的神明,作为红叶之神的姐姐静叶和作为丰收之神的妹妹穰子.如果把红叶和果实联系在一 起,自然会想到烤红薯 ...

  9. 《University Calculus》-chape10-向量和空间几何学-叉积

    叉积概念的引入: 在平面中我们为了度量一条直线的倾斜状态,为引入倾斜角这个概念.而通过在直角坐标系中建立tan α = k,我们实现了将几何关系和代数关系的衔接,这其实也是用计算机解决几何问题的一个核 ...

  10. STL之algorithm、numeric、functional

    <algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较.交换.查找.遍历操作.复制.修改.反转.排序.合并等等. <numeric>体积很小,只包 ...