WCF实例上下文以及会话学习
实例上下文(InstanceContextMode):可以简单地理解为服务端的服务实例与客户端的服务代理之间的关联方式;
它主要包括三种模式:(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); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2012-05-20 操作MSSQL服务还有测试是否连接1
2012-05-20 操作MSSQL服务还有测试是否连接