在呼叫應用程式中,服務模型層負責將應用程式程式代碼中的方法調用轉譯成輸出訊息、將它們推送至基礎通道、將結果轉譯回應用程式程序代碼中的傳回值和輸出參數,並將結果傳回給呼叫端。 服務模型延伸模組會修改或實作涉及用戶端或發送器功能、自定義行為、訊息和參數攔截,以及其他擴充性功能的執行或通訊行為和功能。
本主題描述如何使用 ClientRuntime Windows Communication Foundation (WCF) 用戶端應用程式中的 和 ClientOperation 類別來修改 WCF 用戶端的預設執行行為,或在傳送或擷取通道層之前或之後攔截或修改訊息、參數或傳回值。 如需擴充服務運行時間的詳細資訊,請參閱 擴充發送器。 如需關於將自定義物件修改和插入到用戶端運行環境中的行為的詳細資訊,請參閱 使用行為設定及擴充運行環境。
客戶
在用戶端上,WCF 用戶端物件或用戶端通道會將方法調用轉換成傳出訊息,並將傳入訊息轉換成傳回給呼叫應用程式的作業結果。 (如需用戶端類型的詳細資訊,請參閱 WCF 客戶端架構。
WCF 用戶端類型具有處理此端點和作業層級功能的運行時間類型。 當應用程式呼叫作業時,會將 ClientOperation 輸出物件轉譯成訊息、處理攔截器、確認輸出呼叫符合目標合約,並將輸出訊息 ClientRuntime交給 ,負責建立和管理輸出通道(以及在雙工服務的情況下為輸入通道),處理額外的輸出訊息處理(例如標頭修改), 雙向處理訊息攔截器,並將輸入雙工呼叫路由傳送至適當的客戶端 DispatchRuntime 物件。 ClientOperation 和 ClientRuntime 都會在訊息(包括錯誤)傳回給用戶端時提供類似的服務。
這兩個運行時間類別是自定義 WCF 用戶端物件和通道處理的主要延伸模組。 類別 ClientRuntime 可讓使用者在合約中攔截和擴展所有訊息的客戶端執行程序。 類別 ClientOperation 可讓使用者攔截和擴充指定作業中所有訊息的客戶端執行。
使用合約、端點和作業行為來修改屬性或插入自定義。 如需如何使用這些類型的行為來執行用戶端運行時間自定義的詳細資訊,請參閱 使用行為設定及擴充運行時間。
情境
擴充客戶端系統的原因有很多,包括:
自訂訊息驗證。 使用者可能想要強制訊息對特定架構有效。 這可以透過實作 IClientMessageInspector 介面並將該實作指派給 MessageInspectors 屬性來完成。 如需範例,請參閱 如何:檢查或修改用戶端上的訊息 和 如何:檢查或修改用戶端上的訊息。
自訂訊息記錄。 使用者可能想要檢查並記錄一組流經端點的應用程式訊息。 這也可以使用訊息攔截器介面來完成。
自訂訊息轉換。 使用者可能想要將特定轉換套用至運行時間中的訊息,而不是修改應用程式程式代碼(例如,版本設定)。 這可以再次使用訊息攔截器介面來完成。
自訂數據模型。 使用者可能想要選擇使用除了 WCF 預設所支援的資料或序列化模型以外的模型(即 System.Runtime.Serialization.DataContractSerializer、System.Xml.Serialization.XmlSerializer 和 System.ServiceModel.Channels.Message 物件)。 這可以藉由實作訊息格式器介面來完成。 如需詳細資訊,請參閱 System.ServiceModel.Dispatcher.IClientMessageFormatter 和 ClientOperation.Formatter 屬性。
自定義參數驗證。 使用者可能想要強制執行具類型的參數有效(與 XML 相反)。 這可以使用參數偵測器介面來完成。 如需範例,請參閱 如何:檢查或修改參數 或 客戶端驗證。
使用 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 用戶端系統中:
使用Formatter屬性來插入自定義IClientMessageFormatter實作以進行作業,或修改目前的格式子。
使用ParameterInspectors屬性來插入自定義IParameterInspector實作,或修改當前的實作。
下列屬性可讓您修改系統,以與格式器和自定義參數偵測器互動:
SerializeRequest使用屬性來控制輸出訊息的串行化。
使用DeserializeReply屬性來控制輸入訊息的還原串行化。
使用 Action 的屬性來控制要求訊息的 WS-Addressing 動作。
使用BeginMethod和EndMethod來指定哪些 WCF 用戶端方法與異步操作相關聯。
使用FaultContractInfos屬性來取得包含那些可能在SOAP錯誤中作為詳細資訊類型出現的類別的集合。
使用 IsInitiating 和 IsTerminating 屬性來控制當作業被呼叫時,會話是被啟動還是被終止。
IsOneWay使用屬性來控制作業是否為單向作業。
使用Parent屬性來獲取包含ClientRuntime的物件。
使用Name 屬性來取得操作的名稱。
使用SyncMethod這個屬性來控制哪一個方法對應至作業。
若要將 WCF 用戶端執行延伸至一個服務作業,請檢閱 類別上 ClientOperation 可用的屬性,以查看修改屬性或實作介面,並將其新增至屬性會建立您要尋找的功能。 選擇要建置的特定延伸模組之後,將您的延伸模組插入適當的ClientOperation屬性,並實作可在叫用時提供類別ClientOperation存取的客戶端行為。 在該行為內,您可以修改 ClientRuntime 屬性以符合您的需求。
一般而言,實作作業行為(實 IOperationBehavior 作介面的物件)已足夠,但您也可以使用端點行為和合約行為,藉由尋找 OperationDescription 特定作業的 ,並附加該處的行為來完成相同的工作。 如需詳細資訊,請參閱 透過行為設定和擴展運行時環境。
若要從組態使用您的自定義行為,請使用自定義行為組態區段處理程式來安裝您的行為。 您也可以建立自訂屬性來整合行為。
如需示範跨 WCF 用戶端攔截的範例,請參閱 如何:檢查或修改參數。