下面這張圖說(shuō)明了WCF整合了微軟現(xiàn)有技術(shù)的優(yōu)點(diǎn)。但是WCF不單單是整合現(xiàn)有技術(shù)這么簡(jiǎn)單。Windows Communication Foundation (WCF) 是一個(gè)運(yùn)行庫(kù)和一組 API,用于創(chuàng)建在服務(wù)與客戶(hù)端之間發(fā)送消息的系統(tǒng)。它使用相同的基礎(chǔ)結(jié)構(gòu)和 API 來(lái)創(chuàng)建應(yīng)用程序。在以前不同技術(shù)的開(kāi)發(fā)過(guò)程和方法是大相徑庭的,在WCF中則一般只需要更改一些屬性或配置即可。
WCF術(shù)語(yǔ)
消息(message)
消息是一個(gè)獨(dú)立的數(shù)據(jù)單元,它可能由幾個(gè)部分組成,包括消息正文和消息頭。
服務(wù)(service)
服務(wù)是一個(gè)構(gòu)造,它公開(kāi)一個(gè)或多個(gè)終結(jié)點(diǎn),其中每個(gè)終結(jié)點(diǎn)都公開(kāi)一個(gè)或多個(gè)服務(wù)操作。
終結(jié)點(diǎn)(endpoint)
終結(jié)點(diǎn)是用來(lái)發(fā)送或接收消息(或同時(shí)執(zhí)行這兩種操作)的構(gòu)造。終結(jié)點(diǎn)包括一個(gè)定義消息可以發(fā)送到的目的地的位置(地址)、一個(gè)描述消息應(yīng)如何發(fā)送的通信機(jī)制規(guī)范(綁定),以及對(duì)可以在該位置發(fā)送或接收(或同時(shí)執(zhí)行這兩種操作)的一組消息的定義(服務(wù)協(xié)定,用于描述可以發(fā)送哪些消息)。 WCF 服務(wù)作為一個(gè)終結(jié)點(diǎn)集合向外界公開(kāi)。
應(yīng)用程序終結(jié)點(diǎn)(application endpoint)
一個(gè)終結(jié)點(diǎn),由應(yīng)用程序公開(kāi)并對(duì)應(yīng)于該應(yīng)用程序?qū)崿F(xiàn)的服務(wù)協(xié)定。
基礎(chǔ)結(jié)構(gòu)終結(jié)點(diǎn)(infrastructure endpoint)
一個(gè)終結(jié)點(diǎn),由基礎(chǔ)結(jié)構(gòu)公開(kāi),以便實(shí)現(xiàn)與服務(wù)協(xié)定無(wú)關(guān)的服務(wù)需要或提供的功能。例如,服務(wù)可能擁有一個(gè)提供元數(shù)據(jù)信息的基礎(chǔ)結(jié)構(gòu)終結(jié)點(diǎn)。
地址(address)
地址指定接收消息的位置。地址以統(tǒng)一資源標(biāo)識(shí)符 (URI) 的形式指定。URI 架構(gòu)部分指定用于到達(dá)地址的傳輸機(jī)制,如 HTTP 和 TCP。URI 的層次結(jié)構(gòu)部分包含一個(gè)唯一的位置,其格式取決于傳輸機(jī)制。
使用終結(jié)點(diǎn)地址可以為服務(wù)中的每個(gè)終結(jié)點(diǎn)創(chuàng)建唯一的終結(jié)點(diǎn)地址,或者在某些條件下在終結(jié)點(diǎn)之間共享一個(gè)地址。下面的示例演示了一個(gè)將 HTTPS 協(xié)議和一個(gè)非默認(rèn)端口結(jié)合使用的地址:HTTPS://cbcye:7788/ServiceModelSamples/CalculatorService
綁定(binding)
綁定定義終結(jié)點(diǎn)與外界進(jìn)行通信的方式。它由一組稱(chēng)為綁定元素的要素構(gòu)造而成,這些元素“堆疊”在一起以形成通信基礎(chǔ)結(jié)構(gòu)。綁定起碼應(yīng)定義傳輸協(xié)議(如 HTTP 或 TCP)和所使用的編碼(如文本或二進(jìn)制)。綁定可以包含指定詳細(xì)信息(例如,用于保護(hù)消息的安全機(jī)制或終結(jié)點(diǎn)所使用的消息模式)的綁定元素。有關(guān)更多信息,請(qǐng)參見(jiàn)(MSDN)配置服務(wù)。
綁定元素(binding element)
綁定元素表示綁定的特定部分,如傳輸協(xié)議、編碼、基礎(chǔ)結(jié)構(gòu)級(jí)協(xié)議(如 WS-ReliableMessaging)的實(shí)現(xiàn)以及通信堆棧的其他任何要素。
行為(behaviors)
行為是控制服務(wù)、終結(jié)點(diǎn)、特定操作或客戶(hù)端的各種運(yùn)行時(shí)特性的要素。行為按照范圍進(jìn)行分組:常見(jiàn)行為在全局范圍內(nèi)影響所有終結(jié)點(diǎn),服務(wù)行為僅影響與服務(wù)相關(guān)的方面,終結(jié)點(diǎn)行為僅影響與終結(jié)點(diǎn)相關(guān)的屬性,操作級(jí)行為影響特定操作。例如,有一種服務(wù)行為是遏制,它指定當(dāng)過(guò)多的消息可能超出服務(wù)的處理能力時(shí),服務(wù)應(yīng)該如何反應(yīng)。另一方面,終結(jié)點(diǎn)行為僅控制與終結(jié)點(diǎn)相關(guān)的方面,如查找安全憑據(jù)的方式和位置。
系統(tǒng)提供的綁定(system-provided bindings)
WCF 包含許多系統(tǒng)提供的綁定。這些綁定是針對(duì)特定方案進(jìn)行優(yōu)化的綁定元素的集合。例如,WSHttpBinding 是為了與實(shí)現(xiàn)各種 WS* 規(guī)范的服務(wù)進(jìn)行互操作而專(zhuān)門(mén)設(shè)計(jì)的。通過(guò)僅提供那些可以正確應(yīng)用于特定方案的選項(xiàng),這些預(yù)定義的綁定可以節(jié)省時(shí)間。如果預(yù)定義的綁定不能滿(mǎn)足您的要求,則可以創(chuàng)建您自己的自定義綁定。
配置與編碼(configuration versus coding)
可以通過(guò)代碼編寫(xiě)、配置或?qū)烧呓Y(jié)合在一起對(duì)應(yīng)用程序進(jìn)行控制。配置的優(yōu)點(diǎn)在于,它使非開(kāi)發(fā)人員(如網(wǎng)絡(luò)管理員)可以在代碼編寫(xiě)完成后直接對(duì)客戶(hù)端和服務(wù)參數(shù)進(jìn)行設(shè)置,而不必重新進(jìn)行編譯。使用配置不僅可以設(shè)置值(如終結(jié)點(diǎn)地址),還可以通過(guò)添加終結(jié)點(diǎn)、綁定和行為來(lái)實(shí)施進(jìn)一步的控制。通過(guò)代碼編寫(xiě),開(kāi)發(fā)人員可以保持對(duì)服務(wù)或客戶(hù)端的所有組件的嚴(yán)格控制,而且可以對(duì)通過(guò)配置完成的所有設(shè)置進(jìn)行檢查,并根據(jù)需要通過(guò)代碼進(jìn)行重寫(xiě)。
服務(wù)操作(service operation)
服務(wù)操作是在服務(wù)的代碼中定義的過(guò)程,用于實(shí)現(xiàn)某種操作的功能。此操作作為一個(gè) WCF 客戶(hù)端上的方法向客戶(hù)端公開(kāi)。該方法可能返回一個(gè)值,并可能采用數(shù)量可選的參數(shù),或是不采用任何參數(shù)且不返回任何響應(yīng)。例如,一個(gè)實(shí)現(xiàn)簡(jiǎn)單的“Hello”的操作可以用作客戶(hù)端存在通知,并可以開(kāi)始一系列操作。
服務(wù)協(xié)定(service contract)
服務(wù)協(xié)定將多個(gè)相關(guān)的操作聯(lián)系在一起,組成單個(gè)功能單元。協(xié)定可以定義服務(wù)級(jí)設(shè)置,如服務(wù)的命名空間、對(duì)應(yīng)的回調(diào)協(xié)定以及其他此類(lèi)設(shè)置。在大多數(shù)情況下,協(xié)定的定義方法是用所選的編程語(yǔ)言創(chuàng)建一個(gè)接口,然后將 ServiceContractAttribute 屬性應(yīng)用于該接口。通過(guò)實(shí)現(xiàn)該接口,可生成實(shí)際的服務(wù)代碼。
操作協(xié)定(operation contract)
操作協(xié)定定義參數(shù)并返回操作的類(lèi)型。在創(chuàng)建定義服務(wù)協(xié)定的接口時(shí),可以通過(guò)將 OperationContractAttribute 屬性應(yīng)用于協(xié)定中包含的每個(gè)方法定義來(lái)表示一個(gè)操作協(xié)定。可以將操作建模為采用單個(gè)消息作為參數(shù)并返回單個(gè)消息,或者建模為采用一組類(lèi)型作為參數(shù)并返回一個(gè)類(lèi)型。在后一種情況下,系統(tǒng)將確定需要為該操作交換的消息的格式。
消息協(xié)定(message contract)
消息協(xié)定描述消息的格式。例如,它會(huì)聲明消息元素應(yīng)包含在消息頭中還是包含在消息正文中,應(yīng)該對(duì)消息的何種元素應(yīng)用何種級(jí)別的安全性,等等。
錯(cuò)誤協(xié)定(fault contract)
可以將錯(cuò)誤協(xié)定與服務(wù)操作進(jìn)行關(guān)聯(lián),以指示可能返回到調(diào)用方的錯(cuò)誤。一個(gè)操作可以具有零個(gè)或更多個(gè)與其相關(guān)聯(lián)的錯(cuò)誤。這些錯(cuò)誤是在編程模型中作為異常建模的 SOAP 錯(cuò)誤。
數(shù)據(jù)協(xié)定(data contract)
服務(wù)使用的數(shù)據(jù)類(lèi)型必須在元數(shù)據(jù)中進(jìn)行描述,以使其他各方可以與該服務(wù)進(jìn)行交互操作。數(shù)據(jù)類(lèi)型的說(shuō)明稱(chēng)為數(shù)據(jù)協(xié)定,而這些類(lèi)型可以在消息的任何部分使用(例如,作為參數(shù)或返回類(lèi)型)。如果服務(wù)僅使用簡(jiǎn)單類(lèi)型,則無(wú)需顯式使用數(shù)據(jù)協(xié)定。
宿主(hosting)
服務(wù)必須承載于某個(gè)進(jìn)程中。“宿主”是控制服務(wù)的生存期的應(yīng)用程序。服務(wù)可以是自承載的,也可以由現(xiàn)有的宿主進(jìn)程進(jìn)行管理。
自承載服務(wù)(self-hosted service)
自承載服務(wù)是在開(kāi)發(fā)人員創(chuàng)建的進(jìn)程應(yīng)用程序中運(yùn)行的服務(wù)。開(kāi)發(fā)人員控制服務(wù)的生存期、設(shè)置服務(wù)的屬性、打開(kāi)服務(wù)(這會(huì)將服務(wù)設(shè)置為偵聽(tīng)模式)以及關(guān)閉服務(wù)。
宿主進(jìn)程(hosting process)
宿主進(jìn)程是專(zhuān)為承載服務(wù)而設(shè)計(jì)的應(yīng)用程序。這些宿主進(jìn)程包括 Internet 信息服務(wù) (IIS)、Windows 激活服務(wù) (WAS) 和 Windows 服務(wù)。在這些宿主方案中,由宿主控制服務(wù)的生存期。例如,使用 IIS 可以設(shè)置包含服務(wù)程序集和配置文件的虛擬目錄。在收到消息時(shí),IIS 將啟動(dòng)服務(wù)并控制服務(wù)的生存期。
實(shí)例化(instancing)
每個(gè)服務(wù)都具有一個(gè)實(shí)例化模型。有三種實(shí)例化模型:“單個(gè)”,在這種模型中,由單個(gè) CLR 對(duì)象為所有客戶(hù)端提供服務(wù);“每個(gè)調(diào)用”,在這種模型中,將創(chuàng)建一個(gè)新的 CLR 對(duì)象來(lái)處理每個(gè)客戶(hù)端調(diào)用;“每個(gè)會(huì)話(huà)”,在這種模型中,將創(chuàng)建一組 CLR 對(duì)象,并且為每個(gè)獨(dú)立的會(huì)話(huà)使用一個(gè)對(duì)象。實(shí)例化模型的選擇取決于應(yīng)用程序要求和服務(wù)的預(yù)期使用模式。
客戶(hù)端應(yīng)用程序(client applicant)
客戶(hù)端應(yīng)用程序是與一個(gè)或多個(gè)終結(jié)點(diǎn)交換消息的程序??蛻?hù)端應(yīng)用程序通過(guò)創(chuàng)建一個(gè) WCF 客戶(hù)端實(shí)例并調(diào)用該 WCF 客戶(hù)端的方法來(lái)開(kāi)始工作。需要注意的是,單個(gè)應(yīng)用程序既可以充當(dāng)客戶(hù)端,也可以充當(dāng)服務(wù)。
通道(channel)
通道是綁定元素的具體實(shí)現(xiàn)。綁定表示配置,而通道是與該配置相關(guān)聯(lián)的實(shí)現(xiàn)。因此,每個(gè)綁定元素都有一個(gè)相關(guān)聯(lián)的通道。通道堆疊在一起以形成綁定的具體實(shí)現(xiàn):通道堆棧。
WCF 客戶(hù)端(WCF client)
WCF 客戶(hù)端是一個(gè)將服務(wù)操作作為方法公開(kāi)的客戶(hù)端應(yīng)用程序構(gòu)造(用您所選的 .NET Framework 編程語(yǔ)言編寫(xiě),如 Visual Basic 或 Visual C#)。任何應(yīng)用程序都可以承載 WCF 客戶(hù)端,包括承載服務(wù)的應(yīng)用程序。因此,可以創(chuàng)建一個(gè)包含其他服務(wù)的 WCF 客戶(hù)端的服務(wù)。 通過(guò)使用 ServiceModel Metadata Utility Tool (Svcutil.exe) 并使其指向正在運(yùn)行的發(fā)布元數(shù)據(jù)的服務(wù),可以自動(dòng)生成 WCF 客戶(hù)端。
元數(shù)據(jù)(metadata)
服務(wù)的元數(shù)據(jù)描述服務(wù)的各種特征,外部實(shí)體需要了解這些特征以便與該服務(wù)進(jìn)行通信。ServiceModel Metadata Utility Tool (Svcutil.exe) 可以使用元數(shù)據(jù)生成 WCF 客戶(hù)端以及客戶(hù)端應(yīng)用程序可用來(lái)與服務(wù)進(jìn)行交互的伴隨配置。服務(wù)所公開(kāi)的元數(shù)據(jù)包括 XML 架構(gòu)文檔(用于定義服務(wù)的數(shù)據(jù)協(xié)定)和 WSDL 文檔(用于描述服務(wù)的方法)。 啟用元數(shù)據(jù)后,WCF 通過(guò)檢查服務(wù)及其終結(jié)點(diǎn)自動(dòng)生成服務(wù)的元數(shù)據(jù)。若要發(fā)布服務(wù)的元數(shù)據(jù),必須顯式啟用元數(shù)據(jù)行為。
安全(Security)
WCF 中的安全包括保密性(為防止偷聽(tīng)而進(jìn)行的消息加密)、完整性(用于檢測(cè)對(duì)消息所做篡改的方法)、身份驗(yàn)證(用于驗(yàn)證服務(wù)器和客戶(hù)端的方法)以及授權(quán)(資源訪(fǎng)問(wèn)控制)。通過(guò)利用現(xiàn)有安全機(jī)制(如 TLS over HTTP,也稱(chēng)為 HTTPS)或通過(guò)實(shí)現(xiàn)各種 WS-* 安全規(guī)范中的一個(gè)或多個(gè)規(guī)范,可以提供這些功能。
傳輸安全模式(transport security model)
可以通過(guò)以下三種模式之一來(lái)保證安全:傳輸模式、消息安全模式和使用消息憑據(jù)的傳輸模式。傳輸安全模式指定由傳輸層機(jī)制(如 HTTPS)提供保密性、完整性和身份驗(yàn)證。在使用像 HTTPS 這樣的傳輸協(xié)議時(shí),此模式的優(yōu)點(diǎn)在于性能出色,而且由于它在 Internet 上非常流行,因此很容易理解。其缺點(diǎn)在于,這種安全分別應(yīng)用于通信路徑中的每個(gè)躍點(diǎn),這使得通信容易遭受“中間人”攻擊。
消息安全模式(message security model)
消息安全模式指定通過(guò)實(shí)現(xiàn)一個(gè)或多個(gè)安全規(guī)范來(lái)保證安全,如名為“Web Services Security: SOAP Message Security”(Web 服務(wù)安全:SOAP 消息安全)的規(guī)范(可在 http://go.microsoft.com/fwlink/?LinkId=94684 獲得)。每個(gè)消息都包含必要的安全機(jī)制,用于在消息傳輸過(guò)程中保證安全,并使接收方能夠檢測(cè)到篡改和對(duì)消息進(jìn)行解密。從這種意義上說(shuō),安全信息封裝在每個(gè)消息中,從而提供了跨多個(gè)躍點(diǎn)的端到端安全。由于安全信息成為消息的一部分,因此還可以在消息中包含多種憑據(jù)(這些憑據(jù)稱(chēng)為“聲明”)。這種方法還具有這樣一個(gè)優(yōu)點(diǎn),即消息可以通過(guò)任意傳輸協(xié)議(包括在其起點(diǎn)和目標(biāo)之間的多個(gè)傳輸協(xié)議)安全地傳送。這種方法的缺點(diǎn)在于所使用的加密機(jī)制較為復(fù)雜,使性能受到影響。
使用消息憑據(jù)的傳輸安全模式(transport with message credential security model)
此模式使用傳輸層來(lái)提供消息的保密性、身份驗(yàn)證和完整性,并且每個(gè)消息都可以包含消息接收方所要求的多個(gè)憑據(jù)(聲明)。
WS-*
一組不斷增加的、在 WCF 中予以實(shí)現(xiàn)的 Web 服務(wù) (WS) 規(guī)范(如 WS-Security、WS-ReliableMessaging 等)的簡(jiǎn)寫(xiě)。
WCF體系結(jié)構(gòu)
下圖說(shuō)明了 Windows Communication Foundation (WCF) 體系結(jié)構(gòu)的主要層。(中英對(duì)照)
協(xié)定和說(shuō)明
協(xié)定定義消息系統(tǒng)的各個(gè)方面。數(shù)據(jù)協(xié)定描述組成某一服務(wù)可創(chuàng)建或使用的每則消息的每個(gè)參數(shù)。消息參數(shù)由 XML 架構(gòu)定義語(yǔ)言 (XSD) 文檔定義,這使得任何理解 XML 的系統(tǒng)均可處理該文檔。消息協(xié)定使用 SOAP 協(xié)議定義特定消息部分,當(dāng)互操作性要求對(duì)消息的某些部分進(jìn)行更精細(xì)的控制時(shí),消息協(xié)定可實(shí)現(xiàn)這種控制。服務(wù)協(xié)定指定服務(wù)的實(shí)際方法簽名,并以支持的編程語(yǔ)言之一(例如 Visual Basic 或 Visual C#)作為接口進(jìn)行分發(fā)。
策略和綁定規(guī)定與某一服務(wù)進(jìn)行通信所需的條件。例如,綁定必須(至少)指定所使用的傳輸(例如 HTTP 或 TCP)和編碼。策略包括安全要求和其他條件,必須滿(mǎn)足這些要求和條件才能與服務(wù)進(jìn)行通信。
服務(wù)運(yùn)行時(shí)
服務(wù)運(yùn)行時(shí)層包含僅在服務(wù)實(shí)際運(yùn)行期間發(fā)生的行為,即該服務(wù)的運(yùn)行時(shí)行為。遏制控制處理的消息數(shù),如果對(duì)服務(wù)的需求增長(zhǎng)到預(yù)設(shè)限制,該消息數(shù)則會(huì)發(fā)生變化。錯(cuò)誤行為指定服務(wù)出現(xiàn)內(nèi)部錯(cuò)誤時(shí)應(yīng)采取的操作,例如控制傳遞給客戶(hù)端的信息(信息過(guò)多會(huì)向惡意用戶(hù)提供攻擊的機(jī)會(huì))。元數(shù)據(jù)行為控制是否以及如何向外部提供元數(shù)據(jù)。實(shí)例行為指定可運(yùn)行的服務(wù)實(shí)例的數(shù)目(例如,singleton 指定只能用單一實(shí)例來(lái)處理所有消息)。通過(guò)事務(wù)行為,可以在失敗時(shí)回滾已進(jìn)行事務(wù)處理的操作。調(diào)度行為用于控制 WCF 基礎(chǔ)結(jié)構(gòu)處理消息的方式。
通過(guò)擴(kuò)展性功能可以自定義運(yùn)行時(shí)進(jìn)程。例如,消息檢查功能用于檢查消息的各個(gè)部分,使用參數(shù)篩選功能可以根據(jù)作用于消息頭的篩選器來(lái)執(zhí)行預(yù)設(shè)操作。
消息傳遞
消息傳遞層由通道組成。通道是以某種方式對(duì)消息進(jìn)行處理(例如通過(guò)對(duì)消息進(jìn)行身份驗(yàn)證)的組件。一組通道也稱(chēng)為“通道堆棧”。通道對(duì)消息和消息頭進(jìn)行操作。這與服務(wù)運(yùn)行時(shí)層不同,服務(wù)運(yùn)行時(shí)層主要涉及對(duì)消息正文內(nèi)容的處理。
有兩種類(lèi)型的通道:傳輸通道和協(xié)議通道。
傳輸通道讀取和寫(xiě)入來(lái)自網(wǎng)絡(luò)(或外部的某些其他通信點(diǎn))的消息。某些傳輸通道使用編碼器來(lái)將消息(表示為 XML Infoset)轉(zhuǎn)換為網(wǎng)絡(luò)所使用的字節(jié)流的表示形式,或?qū)⒆止?jié)流表示形式轉(zhuǎn)換為消息。傳輸通道的示例包括 HTTP、命名管道、TCP 和 MSMQ。編碼的示例包括 XML 和優(yōu)化的二進(jìn)制文件。
協(xié)議通道經(jīng)常通過(guò)讀取或?qū)懭胂⒌钠渌^的方式來(lái)實(shí)現(xiàn)消息處理協(xié)議。此類(lèi)協(xié)議的示例包括 WS-Security 和 WS-Reliability。
消息傳遞層說(shuō)明數(shù)據(jù)的可能格式和交換模式。WS-Security 是對(duì)在消息層啟用安全性的 WS-Security 規(guī)范的實(shí)現(xiàn)。通過(guò) WS-Reliable Messaging 通道可以保證消息的傳遞。編碼器提供了大量的編碼,可使用這些編碼來(lái)滿(mǎn)足消息的需要。HTTP 通道指定應(yīng)使用超文本傳輸協(xié)議來(lái)傳遞消息。同理,TCP 通道指定 TCP 協(xié)議。事務(wù)流通道控制已經(jīng)過(guò)事務(wù)處理的消息模式。通過(guò)命名管道通道可以進(jìn)行進(jìn)程間通信。使用 MSMQ 通道可以與 MSMQ 應(yīng)用程序進(jìn)行互操作。
承載和激活
服務(wù)的終形式為程序。與其他程序類(lèi)似,服務(wù)必須在可執(zhí)行文件中運(yùn)行。這稱(chēng)為“自承載”服務(wù)。
某些服務(wù)(如 IIS 或 Windows 激活服務(wù) (WAS))“被承載”,即在外部代理管理的可執(zhí)行文件中運(yùn)行。通過(guò) WAS,可以在運(yùn)行 WAS 的計(jì)算機(jī)上部署 WCF 應(yīng)用程序時(shí)自動(dòng)激活該應(yīng)用程序。還可通過(guò)可執(zhí)行文件(.exe 文件)的形式來(lái)手動(dòng)運(yùn)行服務(wù)。服務(wù)也可作為 Windows 服務(wù)自動(dòng)運(yùn)行。COM+ 組件也可作為 WCF 服務(wù)承載。