WCF中的Session

WCF是MS基于SOA建立的一套在分布式环境中各个相对独立系统进行通信的构架,实现了最新的基于WS-*规范。按照SOA的原则,相对独自的业务逻辑以service的形式封装,调用者通过Messaging的方式调用Service。对于承载着某个业务功能的实现的Service应该具有上下文无关性,也就是说个构成Service的operation不应该绑定到具体的调用上下文。因为SOA的一个最大的目标就是尽可能地实现重用,只有具有上下文无关性,Service才能实现最大限度的重用。WCF中Session属于Service Contract的范畴,是一个相对抽象的概念,并在Service Contract定义中通过SessionModel参数来实现。Session的创建和结束都有来自Client端的调用来实现。

如何实现和维护Session?

Client不能和Service进行直接交互,只能通过客户端创建的Proxy来间接地实现和service的交互,WCF在创建具体的Service Instance时会构建相关的Instance Context。我们可以制定Service的Instance context model。不同的Instance Context Mode体现为Proxy、Service 调用和Service Instance之间的对应关系,Instance Context Mode决定着不同的Session表现。在WCF中,支持以下3中不同类型的Instance Context Mode:

  • PerCall:WCF为每个Serivce调用创建 一个Service Instance,调用完成后回收该Instance。
  • PerSession:在Session期间的所有Service调用绑定到某一个Service Instance,Session被终止后,Service Instance被回收。
  • Singleton:为具体的Service type进行Host的时候,与之对应的Service Instance就被创建出来,此后所有的Service调用都被关联到该Instance。
PerCall

  1 //IService  2 [ServiceContract]  3  public interface ICalculatorService  4  {  5      [OperationContract(IsOneWay = true)]  6      void PerCall(double x, double y);  7      [OperationContract]  8      double PerSession(double x, double y);  9      [OperationContract] 10      double Singleton(double x, double y); 11  16  } 17 //Service 18 public class CalculatorService : ICalculatorService 19 { 20     #region Constructor 21     public CalculatorService() 22     { 23         Console.WriteLine("Create Service Instance:Current session ID is: {0}", OperationContext.Current.SessionId); 24     } 25     #endregion 26  27     #region Destructor  28     ~CalculatorService() 29     { 30         Console.WriteLine("Destory Service Instance:Current session ID is: {0}", OperationContext.Current.SessionId); 31     } 32     #endregion 33  34     #region Result 35     private double _result; 36     public double Result 37         { 38             get 39             { 40                 return _result; 41             } 42         } 43     #endregion 44  45     #region ICalculator Members 46  47     public void PerCall(double x, double y) 48     {             49         _result += x + y; 50         Console.WriteLine("PerCall:Current session ID is: {0}", OperationContext.Current.SessionId); 51         Console.WriteLine("Current result is {0}", _result.ToString()); 52     } 53  54     public double PerSession(double x, double y) 55     {             56         _result += x + y; 57         Console.WriteLine("PerSession:Current session ID is: {0}", OperationContext.Current.SessionId); 58         Console.WriteLine("Current result is {0}", _result.ToString()); 59         return _result; 60     } 61  62     public double Singleton(double x, double y) 63     {             64         _result += x + y; 65         Console.WriteLine("Singleton:Current session ID is: {0}", OperationContext.Current.SessionId); 66         Console.WriteLine("Current result is {0}", _result.ToString()); 67         return _result; 68     } 69  78  79     #endregion 80 } 81  82 //Host  httpBasicBinding 83 using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) 84 { 85     Console.Title = "WCF Service Host: Session";            86     host.Opened += delegate 87     { 88         Console.WriteLine("Calculator service has been host"); 89     };  90     host.Open();  91     Console.Read(); 92 } 93  94 //Client  httpBasicBinding

 95 Console.Title = "WCF Session: Client"; 96  97 ChannelFactory<ICalculatorService> channelFactory = new ChannelFactory<ICalculatorService>("CalculatorServiceEndpoint"); 98 ICalculatorService channel = channelFactory.CreateChannel(); 99 try100 {101     channel.PerCall(1, 1);102     Console.WriteLine("Channel PerCall 1");103     channel.PerCall(1, 1);104     Console.WriteLine("Channel PerCall 2");105 }106 catch (Exception ex)107 {108     Console.WriteLine("Channel Exception:" + ex.Message);109 }110 (channel as ICommunicationObject).Close();111  112 ICalculatorService channel2 = channelFactory.CreateChannel();113 try114 {115     channel2.PerCall(1, 1);116     Console.WriteLine("Channel2 PerCall 1");117     channel2.PerCall(1, 1);118     Console.WriteLine("Channel2 PerCall 2");119 } 120 catch (Exception ex)121 {122     Console.WriteLine("Channel2 Exception:" + ex.Message);123 }124 (channel2 as ICommunicationObject).Close();125 Console.Read();

 

PerSession Demo

  1 //IService  2 [ServiceContract(SessionMode = SessionMode.Required)]  3  public interface ICalculatorService  4  {  5      [OperationContract]  6      void PerCall(double x, double y);  7      [OperationContract]  8      double PerSession(double x, double y);  9      [OperationContract] 10      double Singleton(double x, double y); 11  12  } 13  14  15 //Service 16 public class CalculatorService : ICalculatorService 17 { 18     #region Constructor 19     public CalculatorService() 20     { 21         Console.WriteLine("Create Service Instance:Current session ID is: {0}", OperationContext.Current.SessionId); 22     } 23     #endregion 24  25     #region Destructor  26     ~CalculatorService() 27     { 28         Console.WriteLine("Destory Service Instance:Current session ID is: {0}", OperationContext.Current.SessionId); 29     } 30     #endregion 31  32     #region Result 33     private double _result; 34     public double Result 35         { 36             get 37             { 38                 return _result; 39             } 40         } 41     #endregion 42  43     #region ICalculator Members 44  45     public void PerCall(double x, double y) 46     {             47         _result += x + y; 48         Console.WriteLine("PerCall:Current session ID is: {0}", OperationContext.Current.SessionId); 49         Console.WriteLine("Current result is {0}", _result.ToString()); 50     } 51  52     public double PerSession(double x, double y) 53     {             54         _result += x + y; 55         Console.WriteLine("PerSession:Current session ID is: {0}", OperationContext.Current.SessionId); 56         Console.WriteLine("Current result is {0}", _result.ToString()); 57         return _result; 58     } 59  60     public double Singleton(double x, double y) 61     {             62         _result += x + y; 63         Console.WriteLine("Singleton:Current session ID is: {0}", OperationContext.Current.SessionId); 64         Console.WriteLine("Current result is {0}", _result.ToString()); 65         return _result; 66     } 67  68     #endregion 69 } 70  71  72 //Host 73 using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) 74 { 75     Console.Title = "WCF Service Host: Session";            76     host.Opened += delegate 77     { 78         Console.WriteLine("Calculator service has been host"); 79     };  80     host.Open();  81     Console.Read(); 82 } 83  84 //Client 85 Console.Title = "WCF Session: Client"; 86  87 ChannelFactory<ICalculatorService> channelFactory = new ChannelFactory<ICalculatorService>("CalculatorServiceEndpoint") 88 ICalculatorService channel = channelFactory.CreateChannel(); 89 try 90 { 91     double retValue = 0; 92     retValue = channel.PerSession(1, 1); 93     Console.WriteLine(string.Format("Channel PerCall 1,reback value is {0}",retValue.ToString())); 94     retValue = channel.PerSession(1, 1); 95     Console.WriteLine(string.Format("Channel PerCall 1,reback value is {0}", retValue.ToString())); 96 } 97 catch (Exception ex) 98 { 99     Console.WriteLine("Channel Exception:" + ex.Message);100 }101 (channel as ICommunicationObject).Close();102  103 ICalculatorService channel2 = channelFactory.CreateChannel();104 try105 {106     double retValue = 0;107     retValue = channel2.PerSession(1, 1);108     Console.WriteLine(string.Format("Channel PerCall 2,reback value is {0}", retValue.ToString()));109     retValue = channel2.PerSession(1, 1);110     Console.WriteLine(string.Format("Channel PerCall 2,reback value is {0}", retValue.ToString()));111 } 112 catch (Exception ex)113 {114     Console.WriteLine("Channel2 Exception:" + ex.Message);115 }116 (channel2 as ICommunicationObject).Close();117 Console.Read();

转载于:https://www.cnblogs.com/fangrobert/archive/2011/09/21/2160146.html

WCF - Session 剖析相关推荐

  1. WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务

    原文:WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务 在<基于IIS的WCF服务寄宿(Hosting)实现揭秘>中,我们谈到在采用基于IIS(或者 ...

  2. WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)

    [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在.NET中,所有的集合都实现了IEnumerable接口,比如Arra ...

  3. WCF技术剖析(卷1)正式出版

    [书     名] WCF技术剖析(卷1) [作     者] 蒋金楠 [出     版] 电子工业出版社 [书     号] 9787121089985 [出版日期] 2009 年7月 [开     ...

  4. WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)

    在.NET Framework 2.0中,泛型第一次被引入.我们可以定义泛型接口.泛型类型.泛型委托和泛型方法.序列化依赖于真实具体的类型,而泛型则刻意模糊了具体类型概念.而集合代表一组对象的组合,集 ...

  5. WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

    如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该 ...

  6. WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[WS标准篇]

    元数据实际上是服务终结点的描述,终结点由地址(Address).绑定(Binding)和契约(Contract)经典的ABC三要素组成.认真阅读过<WCF技术剖析(卷1)>的读者相对会对这 ...

  7. WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用

    在完成了对于WCF事务编程(<上篇>.<中篇>.<下篇>)的介绍后,本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务 ...

  8. WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]

    在<上篇>中,我通过使用Delegate的方式解决了服务调用过程中的异常处理以及对服务代理的关闭.对于<WCF技术剖析(卷1)>的读者,应该会知道在第7章中我通过类似于AOP的 ...

  9. WCF技术剖析之二十一:WCF基本异常处理模式[中篇]

    通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WC ...

最新文章

  1. 批量mergeinto
  2. Nginx使用教程(五):使用Nginx缓存之缓存静态内容
  3. Windows10 将 YOLOX模型转换为OpenVINO需要的IR文件
  4. 【数据结构与算法】之深入解析“验证二叉搜索树”的求解思路与算法示例
  5. 动画函数requestAnimationFrame
  6. java字符串 删除指定字符的那些事
  7. Web前端期末大作业--响应式性感美女模特博客网页设计(HTML+CSS+JavaScript)实现
  8. 【教你如何放大招】程序猿是如何一点点的吃下一个产品的
  9. Pycharm配置Anaconda
  10. Python——查看帮助手册
  11. python自动化(七)自动化测试平台开发:1.自动化测试平台简介
  12. 8个接私活的网站,只要你有码,那“我”就有钱
  13. 关于alfa无线设备
  14. 无盘服务器怎么安装驱动,无盘网吧的摄像头驱动安装的解决方案
  15. 生成树协议STP(Spanning Tree Protocol)
  16. 共享单车泡沫破灭,自行车产业链的每个环节都被波及
  17. Tello无人机马达更换
  18. NVDLA VP使用指南
  19. csr8675 设置tws_tws 004如何将nodejs配置为使用端口443
  20. Python中的单引号和双引号 的使用有什么区别

热门文章

  1. pcb怎么画边框_关于PCB焊盘,你了解多少?
  2. 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
  3. C语言 之 PTA乙级错误集锦
  4. php方行图片裁剪为圆形,如何将图片裁成圆形、矩形……各种形状?
  5. webscraper多页爬取_【实践】笔记_Chrome插件webscraper爬取天眼通数据
  6. android不调用系统发送短信,android之两种方式调用短信发送接口
  7. Hbase基础(特点、架构、应用场景、集群搭建、HA设计)这一篇就够了
  8. h5 video视频播放的同时加水印,图片加水印同样的原理
  9. 使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点
  10. 力扣(LeetCode)刷题,简单题(第13期)