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

    文章

    5290

    浏览量

    119789
  • WCF
    WCF
    +关注

    关注

    0

    文章

    4

    浏览量

    6944
收藏 人收藏

    评论

    相关推荐

    AI编译器技术剖析

    随着人工智能技术的飞速发展,AI编译器作为一种新兴的编译技术逐渐进入人们的视野。AI编译器不仅具备传统编译器的功能,如将高级语言编写的源代码转换为机器可执行的代码,还融入了人工智能技术实现
    的头像 发表于 07-17 18:28 1395次阅读

    鸿蒙开发:PageAbility的启动模式

    启动模式对应PageAbility被启动时的行为,支持单实例模式、多实例模式两种启动模式
    的头像 发表于 06-17 14:35 301次阅读
    鸿蒙开发:PageAbility的启动<b class='flag-5'>模式</b>

    鸿蒙Ability Kit(程序框架服务)【UIAbility组件启动模式

    UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式
    的头像 发表于 06-06 11:05 708次阅读
    鸿蒙Ability Kit(程序框架服务)【UIAbility组件启动<b class='flag-5'>模式</b>】

    深入剖析“复坦希UVLED固化炉”的工作原理与技术创新

    在现代工业制造中,UV固化技术因其高效、环保的特点而受到广泛关注。在众多UV固化设备中,“复坦希UVLED固化炉”凭借其独特的工作原理和卓越的技术创新,成为行业内的佼佼者。本文将深入剖析这款设备
    的头像 发表于 05-28 14:32 413次阅读

    电子测量技术的主要特点及应用实例

    电子测量技术,作为电子学的一个重要分支,是利用电子技术手段对各种电参量和非电参量进行测量和分析的技术。随着科技的快速发展,电子测量技术在科研、生产、教育等领域发挥着越来越重要的作用。本
    的头像 发表于 05-16 16:18 1635次阅读

    OpenHarmony实例应用:【常用组件和容器低代码】

    基于ArkTS语言的低代码开发方式实现的一个简单实例
    的头像 发表于 04-14 09:27 747次阅读
    OpenHarmony<b class='flag-5'>实例</b>应用:【常用组件和容器低代码】

    实战经验 | STM32G474 中 Triggered-half 模式实现

    关键词:Triggered-half,Interleave 目录预览 1、引言 2、Triggered-half 模式介绍 3、应用实例 4、小结 01 引言 STM32 G474 中包含了针对
    的头像 发表于 12-11 18:15 1604次阅读
    实战经验 | STM32G474 中 Triggered-half <b class='flag-5'>模式</b>的<b class='flag-5'>实现</b>

    在CCM下运行的离线反激式转换器中峰值初级电流控制设计实现

    实例展示了在连续电流模式(CCM)下运行的离线反激式转换器中峰值初级电流控制的实现。峰值初级电流控制是基于IC UC2842 中使用的控制技术实现
    的头像 发表于 12-05 15:57 1415次阅读
    在CCM下运行的离线反激式转换器中峰值初级电流控制设计<b class='flag-5'>实现</b>

    深入剖析高速SiC MOSFET的开关行为

    深入剖析高速SiC MOSFET的开关行为
    的头像 发表于 12-04 15:26 868次阅读
    深入<b class='flag-5'>剖析</b>高速SiC MOSFET的开关行为

    php设计模式和应用场景

    ,从小型的网站到大型的企业级应用程序。 下面将介绍一些常见的PHP设计模式及其应用场景。 单例模式(Singleton Pattern): 单例模式用于限制类的实例化,确保一个类只有一
    的头像 发表于 12-04 14:54 780次阅读

    深度剖析 IGBT 栅极驱动注意事项

    深度剖析 IGBT 栅极驱动注意事项
    的头像 发表于 11-24 14:48 644次阅读
    深度<b class='flag-5'>剖析</b> IGBT 栅极驱动注意事项

    数字隔离器的剖析

    电子发烧友网站提供《数字隔离器的剖析.pdf》资料免费下载
    发表于 11-24 10:41 2次下载
    数字隔离器的<b class='flag-5'>剖析</b>

    通过Level和Step两方面剖析现代电子集成技术

    芯片上的集成,封装内的集成,PCB板级集成,是电子集成的三个层次。每一个层次的集成,都分为不同的环节。这篇文章,我们从层次-Level和环节-Step两个方面来剖析现代电子集成技术
    发表于 11-15 15:11 575次阅读
    通过Level和Step两方面<b class='flag-5'>剖析</b>现代电子集成<b class='flag-5'>技术</b>

    几种常见的设计模式实现

    1.单例模式 作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例。 应用:常用于管理资源,如日志、线程池 实现要点: 在类中,要构造一个
    的头像 发表于 11-13 14:25 492次阅读
    几种常见的设计<b class='flag-5'>模式</b><b class='flag-5'>实现</b>

    各类设计模式实现

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累
    的头像 发表于 11-11 11:45 695次阅读
    各类设计<b class='flag-5'>模式</b>及<b class='flag-5'>实现</b>