WCF - Session 剖析
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。
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();
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 剖析相关推荐
- WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务
原文:WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务 在<基于IIS的WCF服务寄宿(Hosting)实现揭秘>中,我们谈到在采用基于IIS(或者 ...
- WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)
[爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在.NET中,所有的集合都实现了IEnumerable接口,比如Arra ...
- WCF技术剖析(卷1)正式出版
[书 名] WCF技术剖析(卷1) [作 者] 蒋金楠 [出 版] 电子工业出版社 [书 号] 9787121089985 [出版日期] 2009 年7月 [开 ...
- WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)
在.NET Framework 2.0中,泛型第一次被引入.我们可以定义泛型接口.泛型类型.泛型委托和泛型方法.序列化依赖于真实具体的类型,而泛型则刻意模糊了具体类型概念.而集合代表一组对象的组合,集 ...
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该 ...
- WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[WS标准篇]
元数据实际上是服务终结点的描述,终结点由地址(Address).绑定(Binding)和契约(Contract)经典的ABC三要素组成.认真阅读过<WCF技术剖析(卷1)>的读者相对会对这 ...
- WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用
在完成了对于WCF事务编程(<上篇>.<中篇>.<下篇>)的介绍后,本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务 ...
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
在<上篇>中,我通过使用Delegate的方式解决了服务调用过程中的异常处理以及对服务代理的关闭.对于<WCF技术剖析(卷1)>的读者,应该会知道在第7章中我通过类似于AOP的 ...
- WCF技术剖析之二十一:WCF基本异常处理模式[中篇]
通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WC ...
最新文章
- 批量mergeinto
- Nginx使用教程(五):使用Nginx缓存之缓存静态内容
- Windows10 将 YOLOX模型转换为OpenVINO需要的IR文件
- 【数据结构与算法】之深入解析“验证二叉搜索树”的求解思路与算法示例
- 动画函数requestAnimationFrame
- java字符串 删除指定字符的那些事
- Web前端期末大作业--响应式性感美女模特博客网页设计(HTML+CSS+JavaScript)实现
- 【教你如何放大招】程序猿是如何一点点的吃下一个产品的
- Pycharm配置Anaconda
- Python——查看帮助手册
- python自动化(七)自动化测试平台开发:1.自动化测试平台简介
- 8个接私活的网站,只要你有码,那“我”就有钱
- 关于alfa无线设备
- 无盘服务器怎么安装驱动,无盘网吧的摄像头驱动安装的解决方案
- 生成树协议STP(Spanning Tree Protocol)
- 共享单车泡沫破灭,自行车产业链的每个环节都被波及
- Tello无人机马达更换
- NVDLA VP使用指南
- csr8675 设置tws_tws 004如何将nodejs配置为使用端口443
- Python中的单引号和双引号 的使用有什么区别
热门文章
- pcb怎么画边框_关于PCB焊盘,你了解多少?
- 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
- C语言 之 PTA乙级错误集锦
- php方行图片裁剪为圆形,如何将图片裁成圆形、矩形……各种形状?
- webscraper多页爬取_【实践】笔记_Chrome插件webscraper爬取天眼通数据
- android不调用系统发送短信,android之两种方式调用短信发送接口
- Hbase基础(特点、架构、应用场景、集群搭建、HA设计)这一篇就够了
- h5 video视频播放的同时加水印,图片加水印同样的原理
- 使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点
- 力扣(LeetCode)刷题,简单题(第13期)