WCF實(shí)例上下文基本內(nèi)容概述
WCF開發(fā)工具是一款由微軟公司開發(fā)的功能強(qiáng)大的插件,它主要作用域通信方面,可以為開發(fā)人員帶來非常大的好處。在這里我們將會(huì)為大家詳細(xì)介紹一下有關(guān)WCF實(shí)例上下文的基本內(nèi)容。#t#
WCF實(shí)例上下文是對(duì)服務(wù)實(shí)例的封裝,是WCF管理服務(wù)實(shí)例生命周期的依托。我們先撇開WCF,來簡單介紹一下在托管的環(huán)境中,公共語言運(yùn)行時(shí)(CLR)是如何進(jìn)行托管對(duì)象的生命周期的。在一個(gè)托管應(yīng)用程序中,我們通過不同的方式創(chuàng)建一個(gè)托管對(duì)象(比如通過new關(guān)鍵字、反射或反序列化等)時(shí),CLR會(huì)在托管堆為該對(duì)象開辟一塊內(nèi)存空間。對(duì)象的本質(zhì)就是存儲(chǔ)于某塊內(nèi)存中數(shù)據(jù)的體現(xiàn),對(duì)象的生命周期終止于相應(yīng)內(nèi)存被回收之時(shí)。對(duì)于CLR來說,負(fù)責(zé)對(duì)托管堆(在這里主要指GC堆)進(jìn)行回收的組件是垃圾收集器(GC),GC掌握著托管對(duì)象的生殺大權(quán),決定著托管對(duì)象的生命周期。
當(dāng)GC在進(jìn)行垃圾回收的時(shí)候,會(huì)將“無用”的對(duì)象標(biāo)記為垃圾對(duì)象,然后再對(duì)垃圾對(duì)象進(jìn)行清理。GC對(duì)“無用”對(duì)象的識(shí)別機(jī)制很簡單:判斷對(duì)象是否被“根(Root)”所引用。在這里,“根”是對(duì)一組當(dāng)前正被使用,或者以后可能被使用的對(duì)象的統(tǒng)稱,大體包括這樣的對(duì)象:類型的靜態(tài)字段或當(dāng)前的方法參數(shù)和局部變量、CPU寄存器等。
所以,孤立存在的對(duì)象將難逃被GC回收的厄運(yùn)。反之,如果希望某個(gè)對(duì)象常駐內(nèi)存中,我們***的方式就是通過某個(gè)“根”引用該對(duì)象。本章所講的實(shí)例管理,就是對(duì)服務(wù)實(shí)例生命周期的管理,即讓服務(wù)實(shí)例按照我們希望的方式創(chuàng)建、存活和消亡,所以我們***的方式也只能是:在希望服務(wù)實(shí)例存活的時(shí)候讓它被某個(gè)“根”引用,從而阻止GC將其回收;在希望服務(wù)實(shí)例被回收的時(shí)候連“根”去除,使GC能夠?qū)⑵浠厥?。而本?jié)所講的WCF實(shí)例上下文(InstanceContext)就扮演著“根”的角色。
說到WCF實(shí)例上下文,相信讀者不會(huì)感到陌生,因?yàn)樵谶M(jìn)行WCF雙向(Duplex)通信的時(shí)候,我們通過實(shí)例上下文來封裝回調(diào)對(duì)象。在WCF中,實(shí)例上下文不僅僅用于對(duì)回調(diào)對(duì)象的封裝,也用于對(duì)真正服務(wù)實(shí)例的封裝。實(shí)際上可以將WCF的雙向通信理解成一種對(duì)等通信,通信的雙方是對(duì)等的參與者,并沒有嚴(yán)格的服務(wù)端和客戶端之分,或者說通信的雙方交替地扮演著服務(wù)與客戶的角色??蛻舳苏U{(diào)用服務(wù)端操作是一種服務(wù)調(diào)用;服務(wù)端回調(diào)客戶端操作也可以看成是一種服務(wù)調(diào)用。因此,通過實(shí)例上下文對(duì)回調(diào)對(duì)象和服務(wù)實(shí)例進(jìn)行封裝本質(zhì)上是一致的。
一個(gè)WCF服務(wù)通過一個(gè)ServiceHost進(jìn)行寄宿,并添加一到多個(gè)終結(jié)點(diǎn)。對(duì)于接收到的服務(wù)調(diào)用請(qǐng)求,如果相應(yīng)的WCF實(shí)例上下文存在,則通過它得到服務(wù)實(shí)例來處理服務(wù)請(qǐng)求,否則創(chuàng)建服務(wù)實(shí)例并通過實(shí)例上下文對(duì)其進(jìn)行封裝,然后再通過實(shí)例上下文得到具體的服務(wù)實(shí)例進(jìn)行服務(wù)請(qǐng)求處理。
實(shí)例上下文通過類型System.ServiceModel.InstanceContext表示。InstanceContext繼承自CommunicationObject,實(shí)現(xiàn)了IExtensibleObject<InstanceContext>接口。InstanceContext的定義如下面的代碼所示:
- 1: public sealed class InstanceContext : CommunicationObject,
IExtensibleObject<InstanceContext>- 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<InstanceContext> Extensions { get; }
- 13: public ServiceHostBase Host { get; }
- 14: public ICollection<IChannel> IncomingChannels { get; }
- 15: public ICollection<IChannel> OutgoingChannels { get; }
- 16: public SynchronizationContext SynchronizationContext { get; set; }
- 17: }
InstanceContext具有三個(gè)構(gòu)造函數(shù),接受ServiceHostBase對(duì)象和具體的實(shí)例對(duì)象作為其輸入?yún)?shù)。GetServiceInstance和ReleaseServiceInstance用戶服務(wù)實(shí)例的獲取和釋放。IncomingChannels和OutgoingChannels則表示入棧和出棧信道集合。而通過SynchronizationContext屬性則可以設(shè)置或獲取用于異步操作的同步上下文,比如服務(wù)操作須要在非UI線程下操作一個(gè)Windows Form的控件,你就需要基于UI線程的同步上下文(SynchronizationContext)。
以上就是我們?yōu)榇蠹医榻B的WCF實(shí)例上下文相關(guān)內(nèi)容。






















