WCF服務編程-基礎

WCF是微軟建立新一代的分佈式應用及面向服務應用的標準平臺,是基於原有.NET Framework 2.0的擴展。雖然在WCF發佈不久就已經在項目中使用WCF技術了。但是由於在項目中還沒有較大規模的應用WCF技術,因此感覺掌握的還不是很好。網上已經有很多WCF方面的文章了,而且在我學習的過程中幫助也很大。不過技術的東西還是要靠自己邊學邊總結一下。

下面這張圖說明了WCF整合了微軟現有技術的優點。但是WCF不單單是整合現有技術這麼簡單。Windows Communication Foundation (WCF) 是一個運行庫和一組 API,用於創建在服務與客戶端之間發送消息的系統。它使用相同的基礎結構和 API 來創建應用程序。在以前不同技術的開發過程和方法是大相徑庭的,在WCF中則一般只需要更改一些屬性或配置即可。

image

 

WCF術語

消息(message)
消息是一個獨立的數據單元,它可能由幾個部分組成,包括消息正文和消息頭。
 
服務(service)
服務是一個構造,它公開一個或多個終結點,其中每個終結點都公開一個或多個服務操作。
 
終結點(endpoint)
終結點是用來發送或接收消息(或同時執行這兩種操作)的構造。終結點包括一個定義消息可以發送到的目的地的位置(地址)、一個描述消息應如何發送的通信機制規範(綁定),以及對可以在該位置發送或接收(或同時執行這兩種操作)的一組消息的定義(服務協定,用於描述可以發送哪些消息)。 WCF 服務作爲一個終結點集合向外界公開。
 
應用程序終結點(application endpoint)
一個終結點,由應用程序公開並對應於該應用程序實現的服務協定。
 
基礎結構終結點(infrastructure endpoint)
一個終結點,由基礎結構公開,以便實現與服務協定無關的服務需要或提供的功能。例如,服務可能擁有一個提供元數據信息的基礎結構終結點。
 
地址(address)
地址指定接收消息的位置。地址以統一資源標識符 (URI) 的形式指定。URI 架構部分指定用於到達地址的傳輸機制,如 HTTP 和 TCP。URI 的層次結構部分包含一個唯一的位置,其格式取決於傳輸機制。

使用終結點地址可以爲服務中的每個終結點創建唯一的終結點地址,或者在某些條件下在終結點之間共享一個地址。下面的示例演示了一個將 HTTPS 協議和一個非默認端口結合使用的地址:HTTPS://cbcye:7788/ServiceModelSamples/CalculatorService

綁定(binding)
綁定定義終結點與外界進行通信的方式。它由一組稱爲綁定元素的要素構造而成,這些元素“堆疊”在一起以形成通信基礎結構。綁定最起碼應定義傳輸協議(如 HTTP 或 TCP)和所使用的編碼(如文本或二進制)。綁定可以包含指定詳細信息(例如,用於保護消息的安全機制或終結點所使用的消息模式)的綁定元素。有關更多信息,請參見(MSDN)配置服務
 
綁定元素(binding element)
綁定元素表示綁定的特定部分,如傳輸協議、編碼、基礎結構級協議(如 WS-ReliableMessaging)的實現以及通信堆棧的其他任何要素。
 
行爲(behaviors)
行爲是控制服務、終結點、特定操作或客戶端的各種運行時特性的要素。行爲按照範圍進行分組:常見行爲在全局範圍內影響所有終結點,服務行爲僅影響與服務相關的方面,終結點行爲僅影響與終結點相關的屬性,操作級行爲影響特定操作。例如,有一種服務行爲是遏制,它指定當過多的消息可能超出服務的處理能力時,服務應該如何反應。另一方面,終結點行爲僅控制與終結點相關的方面,如查找安全憑據的方式和位置。
 
系統提供的綁定(system-provided bindings)
WCF 包含許多系統提供的綁定。這些綁定是針對特定方案進行優化的綁定元素的集合。例如,WSHttpBinding 是爲了與實現各種 WS* 規範的服務進行互操作而專門設計的。通過僅提供那些可以正確應用於特定方案的選項,這些預定義的綁定可以節省時間。如果預定義的綁定不能滿足您的要求,則可以創建您自己的自定義綁定。
 
配置與編碼(configuration versus coding)
可以通過代碼編寫、配置或將兩者結合在一起對應用程序進行控制。配置的優點在於,它使非開發人員(如網絡管理員)可以在代碼編寫完成後直接對客戶端和服務參數進行設置,而不必重新進行編譯。使用配置不僅可以設置值(如終結點地址),還可以通過添加終結點、綁定和行爲來實施進一步的控制。通過代碼編寫,開發人員可以保持對服務或客戶端的所有組件的嚴格控制,而且可以對通過配置完成的所有設置進行檢查,並根據需要通過代碼進行重寫。
 
服務操作(service operation)
服務操作是在服務的代碼中定義的過程,用於實現某種操作的功能。此操作作爲一個 WCF 客戶端上的方法向客戶端公開。該方法可能返回一個值,並可能採用數量可選的參數,或是不採用任何參數且不返回任何響應。例如,一個實現簡單的“Hello”的操作可以用作客戶端存在通知,並可以開始一系列操作。
 
服務協定(service contract)
服務協定將多個相關的操作聯繫在一起,組成單個功能單元。協定可以定義服務級設置,如服務的命名空間、對應的回調協定以及其他此類設置。在大多數情況下,協定的定義方法是用所選的編程語言創建一個接口,然後將ServiceContractAttribute 屬性應用於該接口。通過實現該接口,可生成實際的服務代碼。
 
操作協定(operation contract)
操作協定定義參數並返回操作的類型。在創建定義服務協定的接口時,可以通過將 OperationContractAttribute 屬性應用於協定中包含的每個方法定義來表示一個操作協定。可以將操作建模爲採用單個消息作爲參數並返回單個消息,或者建模爲採用一組類型作爲參數並返回一個類型。在後一種情況下,系統將確定需要爲該操作交換的消息的格式。
 
消息協定(message contract)
消息協定描述消息的格式。例如,它會聲明消息元素應包含在消息頭中還是包含在消息正文中,應該對消息的何種元素應用何種級別的安全性,等等。
 
錯誤協定(fault contract)
可以將錯誤協定與服務操作進行關聯,以指示可能返回到調用方的錯誤。一個操作可以具有零個或更多個與其相關聯的錯誤。這些錯誤是在編程模型中作爲異常建模的 SOAP 錯誤。
 
數據協定(data contract)
服務使用的數據類型必須在元數據中進行描述,以使其他各方可以與該服務進行交互操作。數據類型的說明稱爲數據協定,而這些類型可以在消息的任何部分使用(例如,作爲參數或返回類型)。如果服務僅使用簡單類型,則無需顯式使用數據協定。
 
宿主(hosting)
服務必須承載於某個進程中。“宿主”是控制服務的生存期的應用程序。服務可以是自承載的,也可以由現有的宿主進程進行管理。
 
自承載服務(self-hosted service)
自承載服務是在開發人員創建的進程應用程序中運行的服務。開發人員控制服務的生存期、設置服務的屬性、打開服務(這會將服務設置爲偵聽模式)以及關閉服務。
 
宿主進程(hosting process)
宿主進程是專爲承載服務而設計的應用程序。這些宿主進程包括 Internet 信息服務 (IIS)、Windows 激活服務 (WAS) 和 Windows 服務。在這些宿主方案中,由宿主控制服務的生存期。例如,使用 IIS 可以設置包含服務程序集和配置文件的虛擬目錄。在收到消息時,IIS 將啓動服務並控制服務的生存期。
 
實例化(instancing)
每個服務都具有一個實例化模型。有三種實例化模型:“單個”,在這種模型中,由單個 CLR 對象爲所有客戶端提供服務;“每個調用”,在這種模型中,將創建一個新的 CLR 對象來處理每個客戶端調用;“每個會話”,在這種模型中,將創建一組 CLR 對象,並且爲每個獨立的會話使用一個對象。實例化模型的選擇取決於應用程序要求和服務的預期使用模式。
 
客戶端應用程序(client applicant)
客戶端應用程序是與一個或多個終結點交換消息的程序。客戶端應用程序通過創建一個 WCF 客戶端實例並調用該 WCF 客戶端的方法來開始工作。需要注意的是,單個應用程序既可以充當客戶端,也可以充當服務。
 
通道(channel)
通道是綁定元素的具體實現。綁定表示配置,而通道是與該配置相關聯的實現。因此,每個綁定元素都有一個相關聯的通道。通道堆疊在一起以形成綁定的具體實現:通道堆棧。
 
WCF 客戶端(WCF client)
WCF 客戶端是一個將服務操作作爲方法公開的客戶端應用程序構造(用您所選的 .NET Framework 編程語言編寫,如 Visual Basic 或 Visual C#)。任何應用程序都可以承載 WCF 客戶端,包括承載服務的應用程序。因此,可以創建一個包含其他服務的 WCF 客戶端的服務。 通過使用 ServiceModel Metadata Utility Tool (Svcutil.exe) 並使其指向正在運行的發佈元數據的服務,可以自動生成 WCF 客戶端。
 
元數據(metadata)
服務的元數據描述服務的各種特徵,外部實體需要了解這些特徵以便與該服務進行通信。ServiceModel Metadata Utility Tool (Svcutil.exe) 可以使用元數據生成 WCF 客戶端以及客戶端應用程序可用來與服務進行交互的伴隨配置。服務所公開的元數據包括 XML 架構文檔(用於定義服務的數據協定)和 WSDL 文檔(用於描述服務的方法)。 啓用元數據後,WCF 通過檢查服務及其終結點自動生成服務的元數據。若要發佈服務的元數據,必須顯式啓用元數據行爲。
 
安全(Security)
WCF 中的安全包括保密性(爲防止偷聽而進行的消息加密)、完整性(用於檢測對消息所做篡改的方法)、身份驗證(用於驗證服務器和客戶端的方法)以及授權(資源訪問控制)。通過利用現有安全機制(如 TLS over HTTP,也稱爲 HTTPS)或通過實現各種 WS-* 安全規範中的一個或多個規範,可以提供這些功能。
 
傳輸安全模式(transport security model)
可以通過以下三種模式之一來保證安全:傳輸模式、消息安全模式和使用消息憑據的傳輸模式。傳輸安全模式指定由傳輸層機制(如 HTTPS)提供保密性、完整性和身份驗證。在使用像 HTTPS 這樣的傳輸協議時,此模式的優點在於性能出色,而且由於它在 Internet 上非常流行,因此很容易理解。其缺點在於,這種安全分別應用於通信路徑中的每個躍點,這使得通信容易遭受“中間人”攻擊。
 
消息安全模式(message security model)
消息安全模式指定通過實現一個或多個安全規範來保證安全,如名爲“Web Services Security: SOAP Message Security”(Web 服務安全:SOAP 消息安全)的規範(可在 http://go.microsoft.com/fwlink/?LinkId=94684 獲得)。每個消息都包含必要的安全機制,用於在消息傳輸過程中保證安全,並使接收方能夠檢測到篡改和對消息進行解密。從這種意義上說,安全信息封裝在每個消息中,從而提供了跨多個躍點的端到端安全。由於安全信息成爲消息的一部分,因此還可以在消息中包含多種憑據(這些憑據稱爲“聲明”)。這種方法還具有這樣一個優點,即消息可以通過任意傳輸協議(包括在其起點和目標之間的多個傳輸協議)安全地傳送。這種方法的缺點在於所使用的加密機制較爲複雜,使性能受到影響。
 
使用消息憑據的傳輸安全模式(transport with message credential security model)
此模式使用傳輸層來提供消息的保密性、身份驗證和完整性,並且每個消息都可以包含消息接收方所要求的多個憑據(聲明)。
 
WS-*
一組不斷增加的、在 WCF 中予以實現的 Web 服務 (WS) 規範(如 WS-Security、WS-ReliableMessaging 等)的簡寫。

 

WCF體系結構

下圖說明了 Windows Communication Foundation (WCF) 體系結構的主要層。(中英對照)

The WCF Architecture  WCF 體系結構

協定和說明

協定定義消息系統的各個方面。數據協定描述組成某一服務可創建或使用的每則消息的每個參數。消息參數由 XML 架構定義語言 (XSD) 文檔定義,這使得任何理解 XML 的系統均可處理該文檔。消息協定使用 SOAP 協議定義特定消息部分,當互操作性要求對消息的某些部分進行更精細的控制時,消息協定可實現這種控制。服務協定指定服務的實際方法簽名,並以支持的編程語言之一(例如 Visual Basic 或 Visual C#)作爲接口進行分發。

策略和綁定規定與某一服務進行通信所需的條件。例如,綁定必須(至少)指定所使用的傳輸(例如 HTTP 或 TCP)和編碼。策略包括安全要求和其他條件,必須滿足這些要求和條件才能與服務進行通信。

服務運行時

服務運行時層包含僅在服務實際運行期間發生的行爲,即該服務的運行時行爲。遏制控制處理的消息數,如果對服務的需求增長到預設限制,該消息數則會發生變化。錯誤行爲指定服務出現內部錯誤時應採取的操作,例如控制傳遞給客戶端的信息(信息過多會向惡意用戶提供攻擊的機會)。元數據行爲控制是否以及如何向外部提供元數據。實例行爲指定可運行的服務實例的數目(例如,singleton 指定只能用單一實例來處理所有消息)。通過事務行爲,可以在失敗時回滾已進行事務處理的操作。調度行爲用於控制 WCF 基礎結構處理消息的方式。

通過擴展性功能可以自定義運行時進程。例如,消息檢查功能用於檢查消息的各個部分,使用參數篩選功能可以根據作用於消息頭的篩選器來執行預設操作。

消息傳遞

消息傳遞層由通道組成。通道是以某種方式對消息進行處理(例如通過對消息進行身份驗證)的組件。一組通道也稱爲“通道堆棧”。通道對消息和消息頭進行操作。這與服務運行時層不同,服務運行時層主要涉及對消息正文內容的處理。

有兩種類型的通道:傳輸通道和協議通道。

傳輸通道讀取和寫入來自網絡(或外部的某些其他通信點)的消息。某些傳輸通道使用編碼器來將消息(表示爲 XML Infoset)轉換爲網絡所使用的字節流的表示形式,或將字節流表示形式轉換爲消息。傳輸通道的示例包括 HTTP、命名管道、TCP 和 MSMQ。編碼的示例包括 XML 和優化的二進制文件。

協議通道經常通過讀取或寫入消息的其他頭的方式來實現消息處理協議。此類協議的示例包括 WS-Security 和 WS-Reliability。

消息傳遞層說明數據的可能格式和交換模式。WS-Security 是對在消息層啓用安全性的 WS-Security 規範的實現。通過 WS-Reliable Messaging 通道可以保證消息的傳遞。編碼器提供了大量的編碼,可使用這些編碼來滿足消息的需要。HTTP 通道指定應使用超文本傳輸協議來傳遞消息。同理,TCP 通道指定 TCP 協議。事務流通道控制已經過事務處理的消息模式。通過命名管道通道可以進行進程間通信。使用 MSMQ 通道可以與 MSMQ 應用程序進行互操作。

承載和激活

服務的最終形式爲程序。與其他程序類似,服務必須在可執行文件中運行。這稱爲“自承載”服務。

某些服務(如 IIS 或 Windows 激活服務 (WAS))“被承載”,即在外部代理管理的可執行文件中運行。通過 WAS,可以在運行 WAS 的計算機上部署 WCF 應用程序時自動激活該應用程序。還可通過可執行文件(.exe 文件)的形式來手動運行服務。服務也可作爲 Windows 服務自動運行。COM+ 組件也可作爲 WCF 服務承載。

 

WCF消息處理流程

image

 

參考資料及WCF學習資源

WCF之旅

Windows Communication Foundation》(MSDN中文)

WCF從理論到實踐系列

《WCF揭祕》示例下載

WCF服務編程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章