0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

WCF技術的實例模式的實現原理剖析

454398 ? 來源:博客園 ? 作者:蔣金楠 ? 2020-11-03 11:10 ? 次閱讀

服務調用的目的體現在對某項服務功能的消費上,而功能的實現又定義在相應的服務類型中。不論WCF服務端框架處理服務調用請求的流程有多么復雜,最終都落實在服務實例的激活和操作方法的執(zhí)行上面。WCF中的實例管理(Instance Management)旨在解決服務實例的激活和服務實例生命周期的控制。

會話(Session)的目的在于保持來自相同客戶端(服務代理)多次服務調用之間的狀態(tài)。從消息交換的角度來講,會話通過消息識別機制判斷調用某個服務的消息來源,從而將來自相同客戶端的所有消息關聯在一起。所以,會話實現了消息關聯(Message Correlation)。

實例與會話是WCF非常重要的兩個特性,它們既相對獨立,又互相制約。實例模式與對會話支持程度的不同組合,會讓最終的服務表現出截然不同的行為。對實例管理和會話的合理利用,對于改善和提高WCF服務應用的可擴展性(Scalability)、性能(Performance)、吞吐量(Throughput)等具有決定性作用。服務實例對象并不是孤立存在的,而是被封裝到一個特殊實例上下文(InstanceContext)對象之中,本系列文章從實例上下文說起。

一、實例上下文(InstanceContext)

實例上下文是對服務實例的封裝,是WCF管理服務實例生命周期的依托。我們先撇開WCF,來簡單介紹一下在托管的環(huán)境中,公共語言運行時(CLR)是如何進行托管對象的生命周期的。在一個托管應用程序中,我們通過不同的方式創(chuàng)建一個托管對象(比如通過new關鍵字、反射或反序列化等)時,CLR會在托管堆為該對象開辟一塊內存空間。對象的本質就是存儲于某塊內存中數據的體現,對象的生命周期終止于相應內存被回收之時。對于CLR來說,負責對托管堆(在這里主要指GC堆)進行回收的組件是垃圾收集器(GC),GC掌握著托管對象的生殺大權,決定著托管對象的生命周期。

當GC在進行垃圾回收的時候,會將“無用”的對象標記為垃圾對象,然后再對垃圾對象進行清理。GC對“無用”對象的識別機制很簡單:判斷對象是否被“根(Root)”所引用。在這里,“根”是對一組當前正被使用,或者以后可能被使用的對象的統(tǒng)稱,大體包括這樣的對象:類型的靜態(tài)字段或當前的方法參數和局部變量、CPU寄存器等。

所以,孤立存在的對象將難逃被GC回收的厄運。反之,如果希望某個對象常駐內存中,我們唯一的方式就是通過某個“根”引用該對象。本章所講的實例管理,就是對服務實例生命周期的管理,即讓服務實例按照我們希望的方式創(chuàng)建、存活和消亡,所以我們唯一的方式也只能是:在希望服務實例存活的時候讓它被某個“根”引用,從而阻止GC將其回收;在希望服務實例被回收的時候連“根”去除,使GC能夠將其回收。而本節(jié)所講的實例上下文(InstanceContext)就扮演著“根”的角色。

說到實例上下文,相信讀者不會感到陌生,因為在進行WCF雙向(Duplex)通信的時候,我們通過實例上下文來封裝回調對象。在WCF中,實例上下文不僅僅用于對回調對象的封裝,也用于對真正服務實例的封裝。實際上可以將WCF的雙向通信理解成一種對等通信,通信的雙方是對等的參與者,并沒有嚴格的服務端和客戶端之分,或者說通信的雙方交替地扮演著服務與客戶的角色??蛻舳苏U{用服務端操作是一種服務調用;服務端回調客戶端操作也可以看成是一種服務調用。因此,通過實例上下文對回調對象和服務實例進行封裝本質上是一致的。

實例上下文對服務實例的封裝大體可以通過圖1表示。一個WCF服務通過一個ServiceHost進行寄宿,并添加一到多個終結點。對于接收到的服務調用請求,如果相應的實例上下文存在,則通過它得到服務實例來處理服務請求,否則創(chuàng)建服務實例并通過實例上下文對其進行封裝,然后再通過實例上下文得到具體的服務實例進行服務請求處理。

圖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)。單調模式意味著服務端對于接收到的調用,都會創(chuàng)建新的遠程對象,而單例模式則表示服務端使用相同的遠程對象處理來自不同客戶端的所有遠程調用。單調和單例模式體現了兩種極端的遠程對象激活方式,而CAO則是一種相對折中的方式:一個客戶端代理對象與一個遠程對象一一匹配。WCF實例上下文模式與.NET Remoting的遠程對象激活方式類似,同樣具有三種不同的實例上下文模式,分別與上述三種激活方式匹配。這三種實例上下文模式分別是:單調(Per-Call)模式、會話(Per-Session)模式和單例(Single)模式。

1、單調(Per-Call)模式

單調模式相當于.NET Remoting的SingleCall遠程對象激活方式。如果采用單調實例上下文模式,對于每一個服務調用,不論是來自相同的客戶端(服務代理)還是不同的客戶端,WCF總是創(chuàng)建一個全新的服務實例和實例上下文對象來處理服務調用請求。在服務操作執(zhí)行完畢,實例上下文對象和被封裝的服務實例被回收調。圖2揭示了在單調模式下實例上下文、服務實例和服務代理之間的關聯。

圖2 單調模式下服務代理與服務實例上下文之間的關聯

2、會話(Per-Session)模式

會話(Session)的目的在于保持來自相同客戶端(即同一個服務代理)多次服務調用之間的狀態(tài)。如果從消息交互的角度來講,通過會話可以將來自相同客戶端的多個消息關聯在一起。在會話實例上下文模式下,WCF為每一個服務代理對象分配一個單獨的服務實例上下文對象,對于來自相同服務代理的所有服務調用請求,都將分發(fā)給相同的服務實例上下文處理。會話模式與.NET Remoting下的CAO遠程對象激活模式類似,圖3揭示了會話模式下實例上下文、服務實例和服務代理之間的關系。

圖3 會話模式下服務代理與服務實例上下文之間的關聯

3、單例(Single)模式

單例模式意味著WCF為每個服務維護一個并且僅維護一個服務實例上下文。不論請求來自相同的服務代理還是不同的服務代理,處理服務調用請求都是同一個服務實例上下文對象。單例模式相當于.NET Remoting下的Singleton遠程對象激活方式,圖4揭示了單例模式下實例上下文、服務實例和服務代理之間的關系。

圖4 會話模式下服務代理與服務實例上下文之間的關聯

三、 實例服務行為

在介紹服務寄宿的時候,我們談到過WCF下“契約(Contract)”和“行為(Behavior)”的區(qū)別:契約是涉及雙邊的描述(契約是服務的提供者和服務消費者進行交互的手段),那么行為就是基于單邊的描述??蛻舳诵袨轶w現的是WCF如何進行服務調用的方式,而服務端行為則體現了WCF的請求分發(fā)方式。所以服務契約會通過元數據對外發(fā)布,而服務行為則對于客戶端是透明的。

對于客戶端來講,它所關心的是通過服務調用能夠獲得正確的結果,而不會關心服務端采用怎樣的模式來激活服務實例。所以,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: }

在本系列后續(xù)部分,我將對每一種實例模式的實現原理進行逐個剖析,相信極大的加深讀者對WCF下的服務對象生命周期管理機制的理解。
編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5343

    瀏覽量

    120385
  • WCF
    WCF
    +關注

    關注

    0

    文章

    4

    瀏覽量

    6959
收藏 人收藏

    評論

    相關推薦

    如何實現EEPROM的低功耗模式

    內容進行擦除和重寫。在許多應用中,尤其是在電池供電的設備中,低功耗模式對于延長設備的使用壽命至關重要。以下是實現EEPROM低功耗模式的一些方法: 1. 選擇合適的EEPROM類型 選擇功耗較低
    的頭像 發(fā)表于 12-16 16:54 ?320次閱讀

    如何實現智慧交通的多模式銜接

    實現智慧交通的多模式銜接是一個復雜而系統(tǒng)的工程,它涉及多種交通方式的整合、信息共享、技術應用等多個方面。以下是一些關鍵步驟和策略,以實現智慧交通的多
    的頭像 發(fā)表于 11-22 18:11 ?663次閱讀

    深入剖析2.5D封裝技術優(yōu)勢及應用

    的一項重要創(chuàng)新,不僅提高了芯片的性能和集成度,還為未來的芯片設計提供了更多的可能性。本文將深入剖析2.5D封裝技術的內涵、優(yōu)勢及其在現代半導體工業(yè)中的應用。 一、芯片封裝的重要性 封裝作為半導體制造流程中的關鍵環(huán)節(jié),其核心作用在
    的頭像 發(fā)表于 11-22 09:12 ?1037次閱讀
    深入<b class='flag-5'>剖析</b>2.5D封裝<b class='flag-5'>技術</b>優(yōu)勢及應用

    使用TPS22915B負載開關實現Ship模式

    電子發(fā)燒友網站提供《使用TPS22915B負載開關實現Ship模式.pdf》資料免費下載
    發(fā)表于 09-30 09:52 ?0次下載
    使用TPS22915B負載開關<b class='flag-5'>實現</b>Ship<b class='flag-5'>模式</b>

    AI編譯器技術剖析

    隨著人工智能技術的飛速發(fā)展,AI編譯器作為一種新興的編譯技術逐漸進入人們的視野。AI編譯器不僅具備傳統(tǒng)編譯器的功能,如將高級語言編寫的源代碼轉換為機器可執(zhí)行的代碼,還融入了人工智能技術實現
    的頭像 發(fā)表于 07-17 18:28 ?1640次閱讀

    基于PyTorch的卷積核實例應用

    在深度學習和計算機視覺領域,卷積操作是一種至關重要的技術,尤其在圖像處理和特征提取方面發(fā)揮著核心作用。PyTorch作為當前最流行的深度學習框架之一,提供了強大的張量操作功能和靈活的API,使得實現
    的頭像 發(fā)表于 07-11 15:19 ?464次閱讀

    鴻蒙開發(fā):PageAbility的啟動模式

    啟動模式對應PageAbility被啟動時的行為,支持單實例模式、多實例模式兩種啟動模式
    的頭像 發(fā)表于 06-17 14:35 ?360次閱讀
    鴻蒙開發(fā):PageAbility的啟動<b class='flag-5'>模式</b>

    鴻蒙Ability Kit(程序框架服務)【UIAbility組件啟動模式

    UIAbility的啟動模式是指UIAbility實例在啟動時的不同呈現狀態(tài)。針對不同的業(yè)務場景,系統(tǒng)提供了三種啟動模式
    的頭像 發(fā)表于 06-06 11:05 ?843次閱讀
    鴻蒙Ability Kit(程序框架服務)【UIAbility組件啟動<b class='flag-5'>模式</b>】

    深入剖析“復坦希UVLED固化爐”的工作原理與技術創(chuàng)新

    在現代工業(yè)制造中,UV固化技術因其高效、環(huán)保的特點而受到廣泛關注。在眾多UV固化設備中,“復坦希UVLED固化爐”憑借其獨特的工作原理和卓越的技術創(chuàng)新,成為行業(yè)內的佼佼者。本文將深入剖析這款設備
    的頭像 發(fā)表于 05-28 14:32 ?482次閱讀

    標貝語音識別技術在金融領域中的應用實例

    隨著語音識別技術與文本挖掘、自然語言處理等技術的不斷融合,智能語音交互技術在金融領域中爆發(fā)了出巨大的應用潛力。標貝科技根據自身與金融領域合作的經驗為大家梳理出以下幾點智能語音識別技術
    的頭像 發(fā)表于 05-16 16:55 ?611次閱讀
    標貝語音識別<b class='flag-5'>技術</b>在金融領域中的應用<b class='flag-5'>實例</b>

    電子測量技術的主要特點及應用實例

    電子測量技術,作為電子學的一個重要分支,是利用電子技術手段對各種電參量和非電參量進行測量和分析的技術。隨著科技的快速發(fā)展,電子測量技術在科研、生產、教育等領域發(fā)揮著越來越重要的作用。本
    的頭像 發(fā)表于 05-16 16:18 ?1958次閱讀

    HarmonyOS實戰(zhàn)開發(fā)-如何通過BlendMode屬性來實現掛件和圖片的混合

    介紹 本實例主要通過BlendMode屬性來實現掛件和圖片的混合,通過更改不同的混合參數,能夠展示不同的混合效果。 效果圖預覽 使用說明 : 進入頁面,點擊掛件區(qū)域,進行掛件和圖片的混合,點擊
    發(fā)表于 05-07 14:45

    OpenHarmony實例應用:【常用組件和容器低代碼】

    基于ArkTS語言的低代碼開發(fā)方式實現的一個簡單實例
    的頭像 發(fā)表于 04-14 09:27 ?811次閱讀
    OpenHarmony<b class='flag-5'>實例</b>應用:【常用組件和容器低代碼】

    剖析晶圓級封裝結構的構造原理

    其中,有一個插圖,知識星球里有朋友不明白每層的構造原理,這里我來剖析一下。
    的頭像 發(fā)表于 04-03 11:43 ?1584次閱讀
    <b class='flag-5'>剖析</b>晶圓級封裝結構的構造原理

    LoRa模組FSK模式下WOR功耗估算實例

    LoRa模組(例如SX127X模組、SX126X模組或者LLCC68模組)不僅支持LoRa調制模式,也支持FSK調制模式。實際應用中有部分使用者硬件使用的是LoRa模組,但是使用的不是該模組
    的頭像 發(fā)表于 03-29 08:12 ?4682次閱讀
    LoRa模組FSK<b class='flag-5'>模式</b>下WOR功耗估算<b class='flag-5'>實例</b>