WCF三种实例激活的类型——实践理解三种类型的区别
2011-12-13 09:53
302 查看
从一开始接触WCF就知道这三种实例激活的类型:单调服务(PerCall)、会话服务(Sessionful)、单例服务(Singleton),但也仅仅是“知道”、“听过”而已,每次也都是看到大段的文字描述这三种类型,而每次也都是看得晕晕乎乎,其实一般看这些东西都是
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/sleep.gif)
,只能用实践来解释理论了,不多说了,直接实践吧,O(∩_∩)O~:
服务端代码:
宿主代码:
客户端代码:
在服务端代码中[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]的InstanceContextMode设置的就是实例激活的类型,
如下图为InstanceContextMode = InstanceContextMode.PerCall的执行结果:
1)“Calculator object has been created“出现6次,说明每次服务端发出请求,就会获得一个新建的专门的服务实例,这样也可以证明输出结果为0
![](http://hi.csdn.net/attachment/201112/13/0_13237411600RkQ.gif)
如下图为InstanceContextMode = InstanceContextMode.PerSession的执行结果:
1)当客户端为该服务创建一个新的代理时,会获得一个新建的专有的服务实例,它与相同服务的所有其他实例无关,该实例将一直保留在服务中直到客户端不再需要它,因此在下图中”Calculator object has been created“只会出现2次,而两次的输出结果是3
![](http://hi.csdn.net/attachment/201112/13/0_13237413011WLl.gif)
如下图为InstanceContextMode = InstanceContextMode.Single的执行结果:
1)单例服务是一种极端的共享式服务,所有客户端都将独自连接相同的单个知名实例,而不考虑它们连接的是服务的哪一个终结点,单例服务的生存期是无限的,只有在关闭宿主时才会被释放,创建宿主时,单例服务会被创建,且只能被创建一次,因此下图中“Calculator object has been created”只出现一次,而输出的结果分别为3和6
![](http://hi.csdn.net/attachment/201112/13/0_1323741328QG71.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/sleep.gif)
,只能用实践来解释理论了,不多说了,直接实践吧,O(∩_∩)O~:
服务端代码:
[ServiceContract(Name = "GigManagerServiceContract", Namespace = "http://www.thatindigogirl.com/samples/2006/06")] public interface IGigManagerService { [OperationContract(IsOneWay=true)] void SaveGig(int x); [OperationContract] double GetGig(); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class GigManagerService : IGigManagerService { private double _result; #region IGigManager Members public void SaveGig(int x) { Console.WriteLine("The Add method is invoked and the current session ID is: {0}", OperationContext.Current.SessionId); this._result += x; } public double GetGig() { return this._result; } #endregion public GigManagerService() { Console.WriteLine("Calculator object has been created"); } ~GigManagerService() { Console.WriteLine("Calculator object has been destoried"); } }
宿主代码:
static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(GigManager.GigManagerService))) { host.Opened += delegate { Console.WriteLine("The Calculator service has begun to listen"); }; host.Open(); Timer timer = new Timer(delegate { GC.Collect(); }, null, 0, 100); Console.Read(); } }
客户端代码:
static void Main(string[] args) { GigManagerServiceContractClient client1 = new GigManagerServiceContractClient(); Console.WriteLine("Invocate client1.saveGig(1)"); client1.SaveGig(1); Console.WriteLine("Invocate client1.saveGig(2)"); client1.SaveGig(2); Console.WriteLine("The Result return via client1.GetGig() is :{0}", client1.GetGig()); GigManagerServiceContractClient client2 = new GigManagerServiceContractClient(); Console.WriteLine("Invocate client2.saveGig(1)"); client2.SaveGig(1); Console.WriteLine("Invocate client2.saveGig(2)"); client2.SaveGig(2); Console.WriteLine("The Result return via client2.GetGig() is :{0}", client2.GetGig()); Console.ReadLine(); }
在服务端代码中[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]的InstanceContextMode设置的就是实例激活的类型,
如下图为InstanceContextMode = InstanceContextMode.PerCall的执行结果:
1)“Calculator object has been created“出现6次,说明每次服务端发出请求,就会获得一个新建的专门的服务实例,这样也可以证明输出结果为0
![](http://hi.csdn.net/attachment/201112/13/0_13237411600RkQ.gif)
如下图为InstanceContextMode = InstanceContextMode.PerSession的执行结果:
1)当客户端为该服务创建一个新的代理时,会获得一个新建的专有的服务实例,它与相同服务的所有其他实例无关,该实例将一直保留在服务中直到客户端不再需要它,因此在下图中”Calculator object has been created“只会出现2次,而两次的输出结果是3
![](http://hi.csdn.net/attachment/201112/13/0_13237413011WLl.gif)
如下图为InstanceContextMode = InstanceContextMode.Single的执行结果:
1)单例服务是一种极端的共享式服务,所有客户端都将独自连接相同的单个知名实例,而不考虑它们连接的是服务的哪一个终结点,单例服务的生存期是无限的,只有在关闭宿主时才会被释放,创建宿主时,单例服务会被创建,且只能被创建一次,因此下图中“Calculator object has been created”只出现一次,而输出的结果分别为3和6
![](http://hi.csdn.net/attachment/201112/13/0_1323741328QG71.gif)
相关文章推荐
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- WCF服务实例激活类型编程与开发
- WCF服务实例激活类型编程与开发(转)
- WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发
- VC定义的三种类型DLL有什么区别
- 简单工厂,工厂方法,抽象工厂 三种设计模式的区别和实例
- python数据类型判断type与isinstance的区别实例解析
- JavaScript中boolean类型之三种情景实例代码
- 简单的实例来理解WCF 数据服务
- Spring实例化Bean的三种方式及Bean的类型
- WCF学习之实例类型
- 彻底理解C#中值类型和引用类型的区别
- Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform
- 彻底理解C#中值类型和引用类型的区别
- java 中 单引号和双引号的区别及转换类型实例
- WCF从理论到实践(9):实例模式和对象生命周期 (转)
- 值类型和引用类型的区别深入理解