WCF 学习总结3 -- 实例模式
通过WCF的ServiceBehaviorAttribute设定InstanceContextMode有下面的3中模式:
1. Single —— 表示所有的客户端共享一个会话(服务对象)(服务关闭时才会销毁服务对象)
2. PerCall —— 表示每次调用都会创建一个会话(服务对象)(调用完毕后就会销毁服务对象)
3. PerSession —— 表示为每个连接(每个客户端代理对象) 创建一个会话(服务对象),只有指定IsTerminating=true的操作被调用,或者是设定的SessionTimeout超时的时候,服务对象会被销毁。但支持Session的Binding只有:WSHttpBinding、WSDualHttpBinding、WSFederationHttpBinding、NetTcpBinding。
测试一下上述行为,设计3个Service,每个Service都在构造函数中输出内容并实现IDispose接口,在Dispose()里输出内容。
(准备) Host实现代码:
- static void Main(string[] args)
- {
- ServiceHost host1 = new ServiceHost(typeof(SingleService));
- host1.Open();
- Console.WriteLine("SingleService Opened!");
- ServiceHost host2 = new ServiceHost(typeof(PeerCallService));
- host2.Open();
- Console.WriteLine("PeerCallService Opened!");
- ServiceHost host3 = new ServiceHost(typeof(PeerSessionService));
- host3.Open();
- Console.WriteLine("PeerSessionService Opened!");
- Console.Read();
- }
(一) Single服务契约——服务端启动时实例化
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
- public class SingleService : IService1, IDisposable
- {
- public SingleService()
- {
- Console.WriteLine("SingleService ({0}) [{1:mm:ss.fff}] ctor", this.GetHashCode(), DateTime.Now);
- }
- public string GetData(string value)
- {
- return string.Format("SingleService ({0}) GetData [{1}]", this.GetHashCode(), value);
- }
- public void Dispose()
- {
- Console.WriteLine("SingleService ({0}) [{1:mm:ss.fff}] dispose", this.GetHashCode(), DateTime.Now);
- }
- }
启动Host调用SingleService.GetData,服务端的输出:
上图说明SingleService在服务启动时就创建了。
(二) PerCall服务契约——每次调用都重新实例化
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
- public class PeerCallService : IService1, IDisposable
- {
- public PeerCallService()
- {
- Console.WriteLine("PeerCallService ({0}) [{1:mm:ss.fff}] ctor", this.GetHashCode(), DateTime.Now);
- }
- public string GetData(string value)
- {
- return string.Format("PeerCallService ({0}) GetData [{1}]", this.GetHashCode(), value);
- }
- public void Dispose()
- {
- Console.WriteLine("PeerCallService ({0}) [{1:mm:ss.fff}] dispose", this.GetHashCode(), DateTime.Now);
- }
- }
调用PeerCallService.GetData
(三) PerSession服务契约——客户端第一次调用时实例化
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
- public class PeerSessionService : IService1, IDisposable
- {
- public PeerSessionService()
- {
- Console.WriteLine("PeerSessionService ({0}) [{1:mm:ss.fff}] ctor", this.GetHashCode(), DateTime.Now);
- }
- public string GetData(string value)
- {
- return string.Format("PeerSessionService ({0}) GetData [{1}]", this.GetHashCode(), value);
- }
- public void Dispose()
- {
- Console.WriteLine("PeerSessionService ({0}) [{1:mm:ss.fff}] dispose", this.GetHashCode(), DateTime.Now);
- }
- }
服务端的Session的Timeout是由binding属性receiveTimeout和inactivityTimeout控制的。
- <bindings>
- <wsHttpBinding>
- <binding name="wsHttp" receiveTimeout="00:00:15">
- <reliableSession enabled="true" inactivityTimeout="00:00:15" />
- </binding>
- </wsHttpBinding>
- </bindings>
关于这两个属性的配置,更详细的说明请参考MSDN,按照配置服务对象在客户端没有调用后15秒销毁:

需要注意的是,每次 new WcfSvcPeerSession.Service1Client() 都是一个新的Session。
接下来看看怎么通过 OperationContact 的 IsInitiating 和 IsTerminating 来控制Session。IsInitiating 表示该方法是否可以初始化 Session,IsTerminating 表示该方法是否可以终止 Session。默认设置 IsInitiating=true,IsTerminating=false。另外通过IsInitiating和IsTerminating 控制的时候,必须设置 ServiceContract 的 SessionMode.Required
服务契约的定义
- [ServiceContract(SessionMode = SessionMode.Required)]
- interface IService2
- {
- [OperationContract(IsInitiating=true)]
- void LogIn();
- [OperationContract]
- void DoSth();
- [OperationContract(IsTerminating=true)]
- void LogOff();
- }
服务契约的实现:
- public class PeerSessionService2 : IService2
- {
- public void LogIn()
- {
- var sessionId = OperationContext.Current.SessionId;
- Console.WriteLine("{0} LogIn.", sessionId);
- }
- public void DoSth()
- {
- var sessionId = OperationContext.Current.SessionId;
- Console.WriteLine("{0} DoSth.", sessionId);
- }
- public void LogOff()
- {
- var sessionId = OperationContext.Current.SessionId;
- Console.WriteLine("{0} LogOff.", sessionId);
- }
- }
一旦LogOff即IsTerminating,Session就结束了。再次调用任何服务端方法都会引发异常。
WCF 学习总结3 -- 实例模式的更多相关文章
- WCF服务类的实例模式(本文为转载)
WCF开发时如何选择正确的实例模式(InstanceMode)? 在使用WCF实例模型时,你是否思考过这几个的问题: ”WCF中的实例模式如何正确应用”? ”使用WCF中的实例模式有何原则可以遵循 ...
- WCF学习之旅—TCP双工模式(二十一)
WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...
- WCF学习之旅—HTTP双工模式(二十)
WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...
- WCF并发控制与实例模式
WCF实例模式类型与区别 实例化模式 instanceMode percall 单调模式 [ServiceBehavior(InstanceContextMode=InstanceCon ...
- WCF开发时如何选择正确的实例模式(InstanceMode)?
WCF开发时如何选择正确的实例模式(InstanceMode)? 在使用WCF实例模型时,你是否思考过这几个的问题: ”WCF中的实例模式如何正确应用”? ”使用WCF中的实例模式有何原则可以遵循 ...
- WCF学习笔记之传输安全
WCF学习笔记之传输安全 最近学习[WCF全面解析]下册的知识,针对传输安全的内容做一个简单的记录,这边只是简单的记录一些要点:本文的内容均来自[WCF全面解析]下册: WCF的传输安全主要涉及认证. ...
- WCF学习之旅——第一个WCF示例(一)
最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...
- WCF学习之旅——第一个WCF示例(二)
第四步:通过自我寄宿的方式寄宿服务 WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程.WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段. 终 ...
- WCF会话(Session)与实例(Instance)管理
一.理解Session 1.Session的作用:保留Client和Service之间交互的状态,确保Client与Service之间交互唯一性(SessionId),即:多个Client同时访问Se ...
随机推荐
- mac上xampp配置
sudo su /Applications/XAMPP/xamppfiles/xampp security
- 关于对db_block_gets的理解与实验
实验 一. 自己手动创建的小表 创建一个区大小为 40k SYS@ORCL>show parameter db_block_size NAME ...
- window.location.hash属性介绍
location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url.而location. ...
- hdu 4195
我本来的想法求这个三角形的外心~~ 可以得到三条边对应圆心角 则这个正多边形的一条边对应的圆心角 应可以整除这三个角 但是一开始 没想到暴力枚举边数n, 还用模板求圆心坐标 然后求圆心角 ...
- WIN7+Ubuntu双系统,win7启动不了
在网上搜索了下,大多说的是因为重装引起的坏道, 我经过半天的搜索才找到了问题所在,首先看看下面连接的二楼大神给出的解决方案: https://forum.ubuntu.org.cn/viewtopic ...
- Spring在代码中获取bean的几种方式
方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObj ...
- 解决ubuntu中vi不能正常使用方向键与退格键的问题
方案一: 问题: ubuntu中vi在编辑状态下方向键不能用,还有回格键不能删除等我们平时习惯的一些键都不能使用. 解决办法: 可以安装vim full版本,在full版本下键盘正常,安装好后同样使用 ...
- c++ string c_str() 和data()区别
看下面的英文解释: const char* c_str ( ) const;Get C string equivalentGenerates a null-terminated sequence of ...
- [itint5]树中最大路径和
http://www.itint5.com/oj/#13 要注意,一是空路径也可以,所以最小是0.然后要时刻注意路径顶多有两条子路径+根节点组成,所以更新全局最值时和返回上一级的值要注意分清. #in ...
- linux配置防火墙详细步骤(iptables命令使用方法)
通过本教程操作,请确认您能使用linux本机.如果您使用的是ssh远程,而又不能直接操作本机,那么建议您慎重,慎重,再慎重! 通过iptables我们可以为我们的Linux服务器配置有动态的防火墙,能 ...