0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

WCF技术的实例模式的实现原理剖析

454398 来源:博客园 作者:蒋金楠 2020-11-03 11:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

服务调用的目的体现在对某项服务功能的消费上,而功能的实现又定义在相应的服务类型中。不论WCF服务端框架处理服务调用请求的流程有多么复杂,最终都落实在服务实例的激活和操作方法的执行上面。WCF中的实例管理(Instance Management)旨在解决服务实例的激活和服务实例生命周期的控制。

会话(Session)的目的在于保持来自相同客户端(服务代理)多次服务调用之间的状态。从消息交换的角度来讲,会话通过消息识别机制判断调用某个服务的消息来源,从而将来自相同客户端的所有消息关联在一起。所以,会话实现了消息关联(Message Correlation)。

实例与会话是WCF非常重要的两个特性,它们既相对独立,又互相制约。实例模式与对会话支持程度的不同组合,会让最终的服务表现出截然不同的行为。对实例管理和会话的合理利用,对于改善和提高WCF服务应用的可扩展性(Scalability)、性能(Performance)、吞吐量(Throughput)等具有决定性作用。服务实例对象并不是孤立存在的,而是被封装到一个特殊实例上下文(InstanceContext)对象之中,本系列文章从实例上下文说起。

一、实例上下文(InstanceContext)

实例上下文是对服务实例的封装,是WCF管理服务实例生命周期的依托。我们先撇开WCF,来简单介绍一下在托管的环境中,公共语言运行时(CLR)是如何进行托管对象的生命周期的。在一个托管应用程序中,我们通过不同的方式创建一个托管对象(比如通过new关键字、反射或反序列化等)时,CLR会在托管堆为该对象开辟一块内存空间。对象的本质就是存储于某块内存中数据的体现,对象的生命周期终止于相应内存被回收之时。对于CLR来说,负责对托管堆(在这里主要指GC堆)进行回收的组件是垃圾收集器(GC),GC掌握着托管对象的生杀大权,决定着托管对象的生命周期。

当GC在进行垃圾回收的时候,会将“无用”的对象标记为垃圾对象,然后再对垃圾对象进行清理。GC对“无用”对象的识别机制很简单:判断对象是否被“根(Root)”所引用。在这里,“根”是对一组当前正被使用,或者以后可能被使用的对象的统称,大体包括这样的对象:类型的静态字段或当前的方法参数和局部变量、CPU寄存器等。

所以,孤立存在的对象将难逃被GC回收的厄运。反之,如果希望某个对象常驻内存中,我们唯一的方式就是通过某个“根”引用该对象。本章所讲的实例管理,就是对服务实例生命周期的管理,即让服务实例按照我们希望的方式创建、存活和消亡,所以我们唯一的方式也只能是:在希望服务实例存活的时候让它被某个“根”引用,从而阻止GC将其回收;在希望服务实例被回收的时候连“根”去除,使GC能够将其回收。而本节所讲的实例上下文(InstanceContext)就扮演着“根”的角色。

说到实例上下文,相信读者不会感到陌生,因为在进行WCF双向(Duplex)通信的时候,我们通过实例上下文来封装回调对象。在WCF中,实例上下文不仅仅用于对回调对象的封装,也用于对真正服务实例的封装。实际上可以将WCF的双向通信理解成一种对等通信,通信的双方是对等的参与者,并没有严格的服务端和客户端之分,或者说通信的双方交替地扮演着服务与客户的角色。客户端正常调用服务端操作是一种服务调用;服务端回调客户端操作也可以看成是一种服务调用。因此,通过实例上下文对回调对象和服务实例进行封装本质上是一致的。

实例上下文对服务实例的封装大体可以通过图1表示。一个WCF服务通过一个ServiceHost进行寄宿,并添加一到多个终结点。对于接收到的服务调用请求,如果相应的实例上下文存在,则通过它得到服务实例来处理服务请求,否则创建服务实例并通过实例上下文对其进行封装,然后再通过实例上下文得到具体的服务实例进行服务请求处理。

图1 实例上下文对服务实例的封装

实例上下文通过类型System.ServiceModel.InstanceContext表示。InstanceContext继承自CommunicationObject,实现了IExtensibleObject接口。InstanceContext的定义如下面的代码所示:

   1: public sealed class InstanceContext : CommunicationObject, IExtensibleObject
   2: {   
   3:     //其他成员
   4:     public InstanceContext(object implementation);
   5:     public InstanceContext(ServiceHostBase host);
   6:     public InstanceContext(ServiceHostBase host, object implementation);
   7: 
   8:     public object GetServiceInstance();
   9:     public object GetServiceInstance(Message message);
  10:     public void ReleaseServiceInstance();
  11: 
  12:     public IExtensionCollection Extensions { get; }
  13:     public ServiceHostBase Host { get; }
  14:     public ICollection IncomingChannels { get; }
  15:     public ICollection OutgoingChannels { get; }
  16:     public SynchronizationContext SynchronizationContext { get; set; }
  17: }

InstanceContext具有三个构造函数,接受ServiceHostBase对象和具体的实例对象作为其输入参数。GetServiceInstance和ReleaseServiceInstance用户服务实例的获取和释放。IncomingChannels和OutgoingChannels则表示入栈和出栈信道集合。而通过SynchronizationContext属性则可以设置或获取用于异步操作的同步上下文,比如服务操作须要在非UI线程下操作一个Windows Form的控件,你就需要基于UI线程的同步上下文(SynchronizationContext)。

二、实例上下文模式(InstanceContext Mode)

实例上下文模式(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式。如果读者熟悉.NET Remoting,肯定会很清楚.NET Remoting具有两种不同的远程对象激活方式:服务端激活对象(SAO:Server Activated Object)和客户端激活对象(CAO:Client Activated Object),而前者又具有两种不同的变体:单调(SingleCall)和单例(Singleton)。单调模式意味着服务端对于接收到的调用,都会创建新的远程对象,而单例模式则表示服务端使用相同的远程对象处理来自不同客户端的所有远程调用。单调和单例模式体现了两种极端的远程对象激活方式,而CAO则是一种相对折中的方式:一个客户端代理对象与一个远程对象一一匹配。WCF实例上下文模式与.NET Remoting的远程对象激活方式类似,同样具有三种不同的实例上下文模式,分别与上述三种激活方式匹配。这三种实例上下文模式分别是:单调(Per-Call)模式、会话(Per-Session)模式和单例(Single)模式。

1、单调(Per-Call)模式

单调模式相当于.NET Remoting的SingleCall远程对象激活方式。如果采用单调实例上下文模式,对于每一个服务调用,不论是来自相同的客户端(服务代理)还是不同的客户端,WCF总是创建一个全新的服务实例和实例上下文对象来处理服务调用请求。在服务操作执行完毕,实例上下文对象和被封装的服务实例被回收调。图2揭示了在单调模式下实例上下文、服务实例和服务代理之间的关联。

图2 单调模式下服务代理与服务实例上下文之间的关联

2、会话(Per-Session)模式

会话(Session)的目的在于保持来自相同客户端(即同一个服务代理)多次服务调用之间的状态。如果从消息交互的角度来讲,通过会话可以将来自相同客户端的多个消息关联在一起。在会话实例上下文模式下,WCF为每一个服务代理对象分配一个单独的服务实例上下文对象,对于来自相同服务代理的所有服务调用请求,都将分发给相同的服务实例上下文处理。会话模式与.NET Remoting下的CAO远程对象激活模式类似,图3揭示了会话模式下实例上下文、服务实例和服务代理之间的关系。

图3 会话模式下服务代理与服务实例上下文之间的关联

3、单例(Single)模式

单例模式意味着WCF为每个服务维护一个并且仅维护一个服务实例上下文。不论请求来自相同的服务代理还是不同的服务代理,处理服务调用请求都是同一个服务实例上下文对象。单例模式相当于.NET Remoting下的Singleton远程对象激活方式,图4揭示了单例模式下实例上下文、服务实例和服务代理之间的关系。

图4 会话模式下服务代理与服务实例上下文之间的关联

三、 实例服务行为

在介绍服务寄宿的时候,我们谈到过WCF下“契约(Contract)”和“行为(Behavior)”的区别:契约是涉及双边的描述(契约是服务的提供者和服务消费者进行交互的手段),那么行为就是基于单边的描述。客户端行为体现的是WCF如何进行服务调用的方式,而服务端行为则体现了WCF的请求分发方式。所以服务契约会通过元数据对外发布,而服务行为则对于客户端是透明的。

对于客户端来讲,它所关心的是通过服务调用能够获得正确的结果,而不会关心服务端采用怎样的模式来激活服务实例。所以,WCF实例管理通过服务行为体现,不同的实例上下文模式通过ServiceBehaviorAttribute特性指定。在ServiceBehaviorAttribute中,通过设置InstanceContextMode属性来指定不同的服务实例上下文模式。

   1: [AttributeUsage(AttributeTargets.Class)]
   2: public sealed class ServiceBehaviorAttribute : Attribute, IServiceBehavior
   3: { 
   4:     //其他成员
   5:     public InstanceContextMode InstanceContextMode { get; set; }
   6: }

属性InstanceContextMode的类型为System.ServiceModel.InstanceContextMode枚举,三个枚举值PerCall、PerSession和Single分别表示上述的三种实例上下文模式。默认选项为PerSession。

   1: public enum InstanceContextMode
   2: {
   3:     PerCall,
   4:     PerSession,
   5:     Single
   6: }

在本系列后续部分,我将对每一种实例模式的实现原理进行逐个剖析,相信极大的加深读者对WCF下的服务对象生命周期管理机制的理解。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5621

    浏览量

    130478
  • WCF
    WCF
    +关注

    关注

    0

    文章

    4

    浏览量

    7113
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HSC3211物联网安全芯片:技术剖析与应用指南

    HSC3211物联网安全芯片:技术剖析与应用指南 在物联网技术飞速发展的今天,设备的安全认证和通信问题愈发凸显。HSC3211 物联网安全芯片作为一款关键的安全解决方案,为物联网设备提供了可靠的安全
    的头像 发表于 04-28 15:50 110次阅读

    探索DS3501:高性能数字电位器的技术剖析

    探索DS3501:高性能数字电位器的技术剖析 在电子设计领域,高性能、多功能的器件往往是实现复杂电路的关键。DS3501作为一款由DALLAS SEMICONDUCTOR MAXIM推出的高压、非易
    的头像 发表于 04-17 11:15 169次阅读

    Renesas 7544 系列单片机:技术剖析与设计要点

    Renesas 7544 系列单片机:技术剖析与设计要点 在电子设计领域,单片机作为核心控制元件,其性能和特性对整个系统的稳定性和功能实现起着关键作用。今天,我们就来深入探讨一下 Renesas
    的头像 发表于 04-13 14:20 143次阅读

    深入剖析NCP1237:固定频率电流模式控制器的卓越之选

    深入剖析NCP1237:固定频率电流模式控制器的卓越之选 在电子工程师的日常工作中,电源设计是至关重要的一环。而NCP1237作为一款固定频率电流模式控制器,在电源设计领域展现出了卓越的性能和丰
    的头像 发表于 04-12 09:05 403次阅读

    UCC5672:多模式SCSI 9线终端器的技术剖析与应用

    UCC5672:多模式SCSI 9线终端器的技术剖析与应用 引言 在电子工程领域,SCSI接口在数据存储和传输中扮演着重要角色。随着技术的发展,对SCSI终端器的性能和功能要求也越来越
    的头像 发表于 03-25 15:15 208次阅读

    ADN2855:多速率突发模式时钟与数据恢复IC的技术剖析

    ADN2855:多速率突发模式时钟与数据恢复IC的技术剖析 在光通信领域,GPON/BPON/GEPON光线路终端(OLT)接收器对时钟和数据恢复有着严格要求。ADN2855作为一款专门为该
    的头像 发表于 03-23 11:50 397次阅读

    深入剖析LTC3872-1:无RSENSE电流模式升压DC/DC控制器

    深入剖析LTC3872-1:无RSENSE电流模式升压DC/DC控制器 引言 在电子设计领域,电源管理芯片的性能直接影响着整个系统的稳定性和效率。LTC3872-1作为一款无RSENSE电流模式升压
    的头像 发表于 03-13 15:15 226次阅读

    深入解析L6562:高性能过渡模式PFC控制器

    ,工作在过渡模式(TM),与前代L6561引脚兼容且性能更优。接下来,我们将详细剖析L6562的特性、功能、应用及相关设计要点。 文件下载: l6562.pdf 特性亮点 先进工艺与模式 BCD
    的头像 发表于 01-27 10:55 719次阅读

    L6564T:高性能过渡模式PFC控制器的深度剖析

    L6564T:高性能过渡模式PFC控制器的深度剖析 在开关电源(SMPS)设计领域,功率因数校正(PFC)技术至关重要,它能够提高电源效率、减少谐波污染。今天,我们要深入探讨一款优秀的PFC控制器
    的头像 发表于 01-27 10:35 1155次阅读

    剖析AD8451:电池测试与成型系统的高精度模拟前端控制器

    和丰富的功能。今天,我们就来深入剖析AD8451,探讨它在电池测试与成型系统中的应用。 文件下载: AD8451.pdf 一、AD8451关键特性 (一)集成模式与自动切换 AD8451集成了恒流(CC)和恒压(CV)模式,并能
    的头像 发表于 01-14 11:15 389次阅读

    AMD UltraScale架构:高性能FPGA与SoC的技术剖析

    AMD UltraScale架构:高性能FPGA与SoC的技术剖析 在当今的电子设计领域,高性能FPGA和MPSoC/RFSoC的需求日益增长。AMD的UltraScale架构凭借其创新的技术和卓越
    的头像 发表于 12-15 14:35 792次阅读

    ProfiNet嵌入式板卡,主流替代可实现ProfiNet工业以太网的应用实例

    ProfiNet嵌入式板卡,主流替代可实现ProfiNet工业以太网的应用实例
    的头像 发表于 12-01 17:11 1300次阅读
    ProfiNet嵌入式板卡,主流替代可<b class='flag-5'>实现</b>ProfiNet工业以太网的应用<b class='flag-5'>实例</b>

    【「DeepSeek 核心技术揭秘」阅读体验】--全书概览

    讲解Deepseek的使用方法 第三章 深入剖析Deepseek-V3的模型架构、训练框架、推理阶段优化、后训练优化等关键技术 第四章关于DeepSeek-R1的技术剖析 第五章 从
    发表于 07-21 00:04

    实例解读模拟电子技术

    资料介绍:本文通过丰富多彩的应用实例,由浅入深地剖析模拟电子电路各方面的知识。例如,通过电子地动仪的介绍带领读者进入电子学的殿堂,通过USB充电器和电池保护器介绍有关直流电源的知识,通过电子听诊器
    发表于 05-16 13:29

    UIAbility组件启动模式实例在启动时的不同呈现状态

    UIAbility组件启动模式 UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式: singleton(单
    发表于 05-16 06:10