Share via


擴充用戶端

在呼叫應用程式中,服務模型層會負責使用應用程式程式碼將方法引動過程轉譯到傳出訊息中、將這些訊息推送到基礎通道、將結果轉譯回應用程式程式碼中的傳回值與 out 參數,並將結果傳回到呼叫端。 服務模型延伸會修改或實作涉及用戶端或發送器功能、自訂行為、訊息與參數攔截以及其他擴充性功能的執行或通訊行為與功能。

此主題描述如何在 Windows Communication Foundation (WCF) 用戶端應用程式中使用 ClientRuntimeClientOperation 類別來修改 WCF 用戶端的預設執行行為,或是在從通道層傳送或擷取訊息、參數或傳回值之前或之後加以攔截或修改。 如需有關擴充服務執行階段的詳細資訊,請參閱擴充發送器。 如需有關修改自訂物件並將其插入至用戶端執行階段之行為的詳細資訊,請參閱使用行為來設定與擴充執行階段

用戶端

在用戶端上,WCF 用戶端物件或用戶端通道會將方法引動過程轉換成傳出訊息與傳入訊息中的作業結果,而該結果會傳回到呼叫的應用程式 (如需有關用戶端類型的詳細資訊,請參閱 WCF 用戶端架構)。

WCF 用戶端類型具有可處理這種端點和作業層級功能的執行階段類型。 當應用程式呼叫作業時,ClientOperation 便會將傳出物件轉譯到訊息中、處理攔截器、確認該傳出呼叫符合目標合約,並將傳出訊息交給 ClientRuntime,該執行階段會負責建立及管理傳出通道 (在雙工服務的情況下也包括傳入通道)、處理額外的傳出訊息處理程序 (例如標頭修改)、處理雙向的訊息攔截器,以及將傳入的雙工呼叫傳遞到適當的用戶端 DispatchRuntime 物件。 ClientOperationClientRuntime 都會在訊息 (包括錯誤) 傳回到用戶端時提供相似的服務。

這兩個執行階段類別是用來自訂 WCF 用戶端物件和通道之處理的主要延伸模組。 ClientRuntime 類別讓使用者能夠對合約中的所有訊息進行攔截和擴充用戶端執行。 ClientOperation 類別則讓使用者能夠對特定作業中的所有訊息進行攔截和擴充用戶端執行。

使用合約、端點及作業行為,即可修改屬性或插入自訂。 如需有關如何使用這些行為類型執行用戶端執行階段自訂的詳細資訊,請參閱使用行為來設定與擴充執行階段

案例

用戶端系統會因為一些原因而需要擴充,其中包括:

使用 ClientRuntime 類別

ClientRuntime 類別是一個擴充點,您可以在這個擴充點上新增會攔截訊息及擴充用戶端行為的延伸物件。 攔截物件可以處理特定合約中的所有訊息,只處理特定作業的訊息,執行自訂通道初始設定,以及實作其他的自訂用戶端應用程式行為。

  • CallbackDispatchRuntime 屬性會傳回服務初始化回呼用戶端的分派執行階段物件。

  • OperationSelector 屬性則會接受自訂作業選取器物件。

  • ChannelInitializers 屬性可以用來加入通道初始設定式,以便檢查或修改用戶端通道。

  • Operations 屬性會取得 ClientOperation 物件的集合,而您可以在這些物件中加入自訂訊息攔截器,以提供該作業之訊息的專屬功能。

  • ManualAddressing 屬性允許應用程式關閉一些自動定址標頭,以便直接控制定址。

  • Via 屬性會設定在傳輸層之訊息的目的端值,以便支援媒介及其他案例。

  • MessageInspectors 屬性會取得 IClientMessageInspector 物件的集合,而您可以在這些物件中針對經過 WCF 用戶端的所有訊息,新增自訂訊息攔截器。

此外,還有一些會擷取合約資訊的其他屬性:

如果 WCF 用戶端是雙工 WCF 用戶端,下列屬性還會擷取回呼 WCF 用戶端資訊:

若要在整個 WCF 用戶端上擴充 WCF 用戶端執行,請檢閱 ClientRuntime 類別上可用的屬性,以了解修改屬性或實作介面並將其新增到屬性時,是否會建立您所需要的功能。 選擇了要建置的特定延伸之後,請透過實作會在叫用時提供存取 ClientRuntime 類別的用戶端行為,將您的延伸插入到適當的 ClientRuntime 屬性。

您可以使用作業行為 (實作 IOperationBehavior 的物件)、合約行為 (實作 IContractBehavior 的物件) 或是端點行為 (實作 IEndpointBehavior 的物件),將自訂延伸物件插入到集合中。 安裝行為物件新增到適當的行為集合的方式,可以是程式設計方式、宣告方式 (即透過實作自訂屬性),或是實作自訂 BehaviorExtensionElement 物件以便讓該行為可透過應用程式組態檔來進行插入等方式。 如需詳細資訊,請參閱使用行為來設定與擴充執行階段

如需示範跨 WCF 用戶端攔截的範例,請參閱操作方法:檢查或修改用戶端上的訊息

使用 ClientOperation 類別

用戶端執行階段修改的位置以及範圍僅限一項服務作業之自訂擴充的插入點,就是 ClientOperation 類別。 (若要修改合約中所有訊息的用戶端執行階段行為,請使用 ClientRuntime 類別)。

您可以使用 Operations 屬性找出表示特定服務作業的 ClientOperation 物件。 下列屬性可讓您將自訂物件插入 WCF 用戶端系統中:

下列屬性讓您能夠透過與格式器及自訂參數偵測器互動來修改系統。

  • 使用 SerializeRequest 屬性,即可控制傳出訊息的序列化。

  • 使用 DeserializeReply 屬性,即可控制傳入訊息的還原序列化 (Deserialization)。

  • 使用 Action 屬性,即可控制要求訊息的 WS-Addressing 動作。

  • 使用 BeginMethodEndMethod,即可指定要與非同步作業產生關聯的 WCF 用戶端方法。

  • 使用 FaultContractInfos 屬性來取得集合,其中包含可依詳細類型方式出現在 SOAP 錯誤中的型別。

  • 使用 IsInitiatingIsTerminating 屬性,即可分別控制在呼叫作業時是否要產生或卸除工作階段。

  • 使用 IsOneWay 屬性,即可控制作業是否為單向作業。

  • 使用 Parent 屬性,即可取得 ClientRuntime 包含物件。

  • 使用 Name 屬性,即可取得作業的名稱。

  • 使用 SyncMethod 屬性,即可控制要對應到作業的方法。

若是只要在一個服務作業上擴充 WCF 用戶端執行,請檢閱 ClientOperation 類別上可用的屬性,以了解修改屬性或實作介面並將其新增到屬性時,是否會建立您所需要的功能。 選擇了要建置的特定延伸之後,請透過實作會在叫用時提供存取 ClientOperation 類別的用戶端行為,將您的延伸插入到適當的 ClientOperation 屬性。 然後,您就可以在該行為的內部,將 ClientRuntime 屬性修改成符合您的需求。

一般而言,實作作業行為 (即實作 IOperationBehavior 介面的物件) 就夠了,不過您也可以使用端點行為與合約行為,找到特定作業的 OperationDescription,並在此處附加該行為來達成相同結果。 如需詳細資訊,請參閱使用行為來設定與擴充執行階段

若要從組態使用自訂行為,請使用自訂行為組態區段處理常式來安裝您的行為。 您也可以建立自訂屬性以安裝行為。

如需示範跨 WCF 用戶端攔截的範例,請參閱操作方法:檢查或修改參數

另請參閱