擴充用戶端
在呼叫應用程式中,服務模型層會負責使用應用程式程式碼將方法引動過程轉譯到傳出訊息中、將這些訊息推送到基礎通道、將結果轉譯回應用程式程式碼中的傳回值與 out 參數,並將結果傳回到呼叫端。服務模型擴充功能會修改或實作涉及用戶端或發送器功能、自訂行為、訊息與參數攔截與其他擴充性功能的執行或通訊行為與功能。
本主題會說明如何在 Windows Communication Foundation (WCF) 用戶端應用程式中使用 ClientRuntime 和 ClientOperation 類別來修改 WCF 用戶端的預設執行行為,或者攔截或修改在從通道層為它們進行傳送或擷取之前或之後的訊息、參數或傳回值。如需擴充服務執行階段的詳細資訊,請參閱擴充發送器。如需修改自訂物件並將其插入至用戶端執行階段之行為的詳細資訊,請參閱使用行為來設定與擴充執行階段。
用戶端
在用戶端上,WCF 用戶端物件或用戶端通道會將方法引動過程轉換成傳出訊息與傳入訊息中的作業結果,而該結果會傳回到呼叫應用程式。(如需用戶端類型的詳細資訊,請參閱用戶端架構)。
WCF 用戶端類型具有可處理這種端點和作業層級功能的執行階段型別。當應用程式呼叫作業時,ClientOperation 便會將傳出物件轉譯到訊息中、處理攔截器、確認該傳出呼叫符合目標合約,並將傳出訊息交給 ClientRuntime,該執行階段會負責建立及管理傳出通道 (在雙工服務的情況下也包括傳入通道)、處理額外的傳出訊息處理程序 (例如標頭修改)、處理雙向的訊息攔截器,以及將傳入的雙工呼叫傳遞到適當的用戶端 DispatchRuntime 物件。ClientOperation 和 ClientRuntime 都會在訊息 (包括錯誤) 傳回到用戶端時提供相似的服務。
這兩個執行階段類別是用來自訂 WCF 用戶端物件和通道之處理程序的主要延伸。ClientRuntime 類別讓使用者能夠對合約中的所有訊息進行攔截和擴充用戶端執行。ClientOperation 類別則讓使用者能夠對特定作業中的所有訊息進行攔截和擴充用戶端執行。
使用合約、端點及作業行為,即可修改屬性或插入自訂。如需如何使用這類行為類型來執行用戶端執行階段自訂的詳細資訊,請參閱使用行為來設定與擴充執行階段。
案例
用戶端系統會因為一些原因而需要擴充,其中包括:
- 自訂訊息驗證。使用者可能想要強制訊息對特定結構描述有效。藉由實作 IClientMessageInspector 介面,並將實作 (Implementation) 指派到 MessageInspectors 屬性,即可做到這點。如需範例,請參閱 HOW TO:檢查或修改用戶端上的訊息和HOW TO:檢查或修改用戶端上的訊息。
- 自訂訊息記錄。使用者可能想要檢查和記錄某些流經端點的應用程式訊息集。這項工作也可以用訊息攔截器介面來達成。
- 自訂訊息轉換。除了修改應用程式程式碼以外,使用者可能想要將特定轉換套用到執行階段中的訊息 (例如,為了進行版本管理)。同樣地,這項工作也可以用訊息攔截器介面來達成。
- 自訂資料模型。使用者可能想要擁有不同於 WCF 預設提供的資料或序列化 (Serialization) 模型 (也就是 System.Runtime.Serialization.DataContractSerializer、System.Xml.Serialization.XmlSerializer 及 System.ServiceModel.Channels.Message 物件)。實作訊息格式器介面即可做到這點。如需詳細資訊,請參閱 System.ServiceModel.Dispatcher.IClientMessageFormatter 和 System.ServiceModel.Dispatcher.ClientOperation.Formatter 屬性。
- 自訂參數驗證。使用者可能想要強制型別參數都是有效的 (即非 XML)。使用參數偵測器介面即可做到這點。如需範例,請參閱 HOW TO:檢查或修改參數或Client Validation。
使用 ClientRuntime 類別
ClientRuntime 類別是一個擴充點,您可以在這個擴充點上新增會攔截訊息及擴充用戶端行為的延伸物件。攔截物件可以處理特定合約中的所有訊息,只處理特定作業的訊息,執行自訂通道初始設定,以及實作其他的自訂用戶端應用程式行為。
- CallbackDispatchRuntime 屬性會傳回服務初始化回呼用戶端的分派執行階段物件。
- OperationSelector 屬性則會接受自訂作業選取器物件。
- ChannelInitializers 屬性可以用來加入通道初始設定式,以便檢查或修改用戶端通道。
- Operations 屬性會取得 ClientOperation 物件的集合,而您可以在這些物件中加入自訂訊息攔截器,以提供該作業之訊息的專屬功能。
- ManualAddressing 屬性允許應用程式關閉一些自動定址標頭,以便直接控制定址。
- Via 屬性會設定在傳輸層之訊息的目的端值,以便支援媒介及其他案例。
- MessageInspectors 屬性會取得 IClientMessageInspector 物件的集合,而您可以在這些物件中針對所有經過 WCF 用戶端的訊息新增自訂訊息攔截器。
此外,還有一些會擷取合約資訊的其他屬性:
如果 WCF 用戶端是雙工 WCF 用戶端,下列屬性還會擷取回呼 WCF 用戶端資訊:
- CallbackClientType
- CallbackDispatchRuntime
若要在整個 WCF 用戶端上擴充 WCF 用戶端執行,請檢閱 ClientRuntime 類別上所提供的屬性,以瞭解修改屬性、或實作介面並將其新增到屬性時,是否會建立您所需要的功能。選擇了要建置的特定延伸之後,請透過實作會在叫用時提供存取 ClientRuntime 類別的用戶端行為,將您的延伸插入到適當的 ClientRuntime 屬性。
您可以使用作業行為 (實作 IOperationBehavior 的物件)、合約行為 (實作 IContractBehavior 的物件) 或是端點行為 (實作 IEndpointBehavior 的物件),將自訂延伸物件插入到集合中。安裝行為物件新增到適當的行為集合的方式,可以是程式設計方式、宣告方式 (即透過實作自訂屬性),或是實作自訂 BehaviorExtensionElement 物件以便讓該行為可透過應用程式組態檔來進行插入等方式。如需詳細資訊,請參閱使用行為來設定與擴充執行階段。
如需示範在整個 WCF 用戶端上進行攔截的範例,請參閱 HOW TO:檢查或修改用戶端上的訊息。
使用 ClientOperation 類別
用戶端執行階段修改的位置以及範圍僅限一項服務作業之自訂擴充的插入點,就是 ClientOperation 類別。(若要修改合約中所有訊息的用戶端執行階段行為,請使用 ClientRuntime 類別)。
使用 Operations 屬性,即可找出表示特定服務作業的 ClientOperation 物件。您可以使用下列屬性來將自訂物件插入到 WCF 用戶端系統中:
- 使用 Formatter 屬性,即可插入作業的自訂 IClientMessageFormatter 實作或修改目前的格式器。
- 使用 ParameterInspectors 屬性,即可插入自訂 IParameterInspector 實作或修改目前的實作。
下列屬性讓您能夠透過與格式器及自訂參數偵測器互動來修改系統。
- 使用 SerializeRequest 屬性,即可控制傳出訊息的序列化。
- 使用 DeserializeReply 屬性,即可控制傳入訊息的還原序列化 (Deserialization)。
- 使用 Action 屬性,即可控制要求訊息的 WS-Addressing 動作。
- 使用 BeginMethod 和 EndMethod,即可指定要與非同步作業產生關聯的 WCF 用戶端方法。
- 使用 FaultContractInfos 屬性來取得集合,其中包含可依詳細類型方式出現在 SOAP 錯誤中的型別。
- 使用 IsInitiating 和 IsTerminating 屬性,即可分別控制在呼叫作業時是否要產生或卸除工作階段。
- 使用 IsOneWay 屬性,即可控制作業是否為單向作業。
- 使用 Parent 屬性,即可取得 ClientRuntime 包含物件。
- 使用 Name 屬性,即可取得作業的名稱。
- 使用 SyncMethod 屬性,即可控制要對應到作業的方法。
若是只要在一個服務作業上擴充 WCF 用戶端執行,請檢閱 ClientOperation 類別所提供的屬性,以瞭解修改屬性、或實作介面並將其新增到屬性時,是否會建立您所需要的功能。選擇了要建置的特定延伸之後,請透過實作會在叫用時提供存取 ClientOperation 類別的用戶端行為,將您的延伸插入到適當的 ClientOperation 屬性。然後,您就可以在該行為的內部,將 ClientRuntime 屬性修改成符合您的需求。
一般而言,實作作業行為 (即實作 IOperationBehavior 介面的物件) 就夠了,不過您也可以使用端點行為與合約行為,找到特定作業的 OperationDescription,並在此處附加該行為來達成相同結果。如需詳細資訊,請參閱使用行為來設定與擴充執行階段。
若要從組態使用自訂行為,請使用自訂行為組態區段處理常式來安裝您的行為。您也可以建立自訂屬性以安裝行為。
如需示範在整個 WCF 用戶端上進行攔截的範例,請參閱 HOW TO:檢查或修改參數。
請參閱
工作
HOW TO:檢查或修改用戶端上的訊息
HOW TO:檢查或修改參數