WCF实例上下文以及会话学习
2013-05-20 22:30
405 查看
实例上下文(InstanceContextMode):可以简单地理解为服务端的服务实例与客户端的服务代理之间的关联方式;
它主要包括三种模式:(1)单调 Per-Call (2)单例Single (3)会话Per-Session 它是作用在实现服务契约上
1:首先介绍单调模式Per-Call:
代码如下:
客户端调用代码:
结果
*注意:单调模式(Per-Call):对于服务的调用,不论是来自相同的客户端还是不同的客户端,WCF总是创建一个全新的服务实例和实例上下文对象来处理服务调用;当服务操作执行完毕后,实例上下文对象和被封装的服务实例被回收;[单调服务决定于单调实例上下文模式;也就是采用单调实例上下文模式的服务永远是单调服务]
2:单例模式Single
代码如下:
客户端代码(分别创建两个实例进行调用):
结果显示:
*注意:单例模式Single意味着WCF为每个服务维护一个并且仅维护一个服务实例上下文;不论请求来自相同的服务代理还是不同的服务代理,处理服务调用请求的都是同一个服务实例上下文对象;[单例服务决定于单例实例上下文模式;所以完成由采用的上下文实例上下文模式决定]
3:会话模式Per-Session
WCF为每个服务代理对象分配一个单独的服务实例上下文对象,对于来自相同服务代理的所有服务调用请求,都将分配给相同的服务实例上下文处理;
WCF通过定义SessionModel枚举表示会话的模式分别为:允许(Allowed) ,强制(Required),不允许(NotAllowed) [默认情况下为:Allowed] 它是作用在契约
会话服务决定于会话信道和会话实例上下文模式;所以会话服务由会话模式,绑定和实例上下文模式三都来决定;
*注意:绑定的一些注意事项,BasicHttpBinding 只有创建数据报信道,所以它不能有Allowed或者会报异常;而NetTcpBinding和NetNamedPipeBinding只能创
建会话信道;所以它如果设为NotAllowed也会报异常;而对于WSHttpBinding/Ws2007HttpBinding采用任何一种安全模式或可靠的会话的情况下,会创建会话信
道,否则创建数据报信道;在默认情况下它们采用的是Message安全模式;所以默认下是会话信道;
它主要包括三种模式:(1)单调 Per-Call (2)单例Single (3)会话Per-Session 它是作用在实现服务契约上
1:首先介绍单调模式Per-Call:
代码如下:
[PerCall] public class CalculatorService : ICalculator, IDisposable { public CalculatorService() { Console.WriteLine("{0}: 构造器被调用", Thread.CurrentThread.ManagedThreadId); } ~CalculatorService() { Console.WriteLine("{0}: 终止化器被调用", Thread.CurrentThread.ManagedThreadId); } public void Dispose() { Console.WriteLine("{0}: Dispose方法被调用", Thread.CurrentThread.ManagedThreadId); } public double Add(double x, double y) { Console.WriteLine("{0}: 操作方法被调用", Thread.CurrentThread.ManagedThreadId); return x + y; } }
客户端调用代码:
class Program { static void Main(string[] args) { using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice")) { ICalculator serviceProxy = channelFactory.CreateChannel(); serviceProxy.Add(1, 2); serviceProxy.Add(1, 2); } Console.Read(); } }
结果
*注意:单调模式(Per-Call):对于服务的调用,不论是来自相同的客户端还是不同的客户端,WCF总是创建一个全新的服务实例和实例上下文对象来处理服务调用;当服务操作执行完毕后,实例上下文对象和被封装的服务实例被回收;[单调服务决定于单调实例上下文模式;也就是采用单调实例上下文模式的服务永远是单调服务]
2:单例模式Single
代码如下:
namespace Artech.WcfServices.Service { [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class CalculatorService : ICalculator, IDisposable { public CalculatorService() { Console.WriteLine("{0}: 构造器被调用", Thread.CurrentThread.ManagedThreadId); } ~CalculatorService() { Console.WriteLine("{0}: 终止化器被调用", Thread.CurrentThread.ManagedThreadId); } public void Dispose() { Console.WriteLine("{0}: Dispose方法被调用", Thread.CurrentThread.ManagedThreadId); } public double Add(double x, double y) { Console.WriteLine("{0}: 操作方法被调用", Thread.CurrentThread.ManagedThreadId); return x + y; } } }
客户端代码(分别创建两个实例进行调用):
namespace Artech.WcfServices.Client { class Program { static void Main(string[] args) { using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorservice")) { ICalculator serviceProxy1 = channelFactory.CreateChannel(); serviceProxy1.Add(1, 2); ICalculator serviceProxy2 = channelFactory.CreateChannel(); serviceProxy2.Add(1, 2); } Console.Read(); } } }
结果显示:
*注意:单例模式Single意味着WCF为每个服务维护一个并且仅维护一个服务实例上下文;不论请求来自相同的服务代理还是不同的服务代理,处理服务调用请求的都是同一个服务实例上下文对象;[单例服务决定于单例实例上下文模式;所以完成由采用的上下文实例上下文模式决定]
3:会话模式Per-Session
WCF为每个服务代理对象分配一个单独的服务实例上下文对象,对于来自相同服务代理的所有服务调用请求,都将分配给相同的服务实例上下文处理;
WCF通过定义SessionModel枚举表示会话的模式分别为:允许(Allowed) ,强制(Required),不允许(NotAllowed) [默认情况下为:Allowed] 它是作用在契约
会话服务决定于会话信道和会话实例上下文模式;所以会话服务由会话模式,绑定和实例上下文模式三都来决定;
*注意:绑定的一些注意事项,BasicHttpBinding 只有创建数据报信道,所以它不能有Allowed或者会报异常;而NetTcpBinding和NetNamedPipeBinding只能创
建会话信道;所以它如果设为NotAllowed也会报异常;而对于WSHttpBinding/Ws2007HttpBinding采用任何一种安全模式或可靠的会话的情况下,会创建会话信
道,否则创建数据报信道;在默认情况下它们采用的是Message安全模式;所以默认下是会话信道;
namespace Artech.WcfServices.Service.Interface { [ServiceContract(Namespace = "http://www.artech.com/", SessionMode = SessionMode.Required)] public interface ICalculator { void Add(double op); } }
相关文章推荐
- WCF学习笔记之实例与会话(Instance And Session)
- WCF学习之:实例上下文模式和并发模式的性能影响
- WCF学习:Instance context model(实例模型) 与 Session(会话) 的关系
- WCF小实例以及三种宿主
- 一步一个脚印学习WCF系列之WCF概要—WCF服务的创建与调用HelloWorld实例,通过配置文件方式(六)
- 《WCF按部就班学习系列4_WCF实例管理概述》
- Dom 学习总结以及实例的使用介绍
- WCF 学习总结1 -- 简单实例
- WCF学习(二)对控件简单了解以及4个文本控件的简介
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求
- [WCF 学习笔记] 6. 会话状态
- 深度学习笔记——Word2vec和Doc2vec训练实例以及参数解读
- WCF学习笔记(五)契约双工通信、多契约绑定及对数据库增删改查等综合实例
- C++学习总结(十四)——类的运算符的重载原理,以及重载的实例
- WCF小实例以及三种宿主
- ElasticSearch学习五:实例展示elasticsearch集群生态,分片以及水平扩展.
- php学习之道:php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类
- ITEXT实例学习与研究(二) 之 创建一个细长的浅黄色背景的页面以及纵向页面与横向页面之间的切换
- WCF实例上下文模式与并发模式对性能的影响
- JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)