445
技術社區[雲棲]
通過“四大行為”對WCF的擴展[原理篇]
整個WCF框架由兩個基本的層次構成,即服務模型層和信道層。對信道層的擴展主要通過針對綁定的擴展實現,具體來說就是自定義綁定元素,以及相關的信道管理器(信道監聽器和信道工廠)、信道來改變對消息的處理和傳輸方式。
而對於服務模式型層的擴展則主要體現服務端和客戶端運行時框架的定製,進而讓WCF按照我們希望的方式進行運作。由於整個運行時框架由一係列的可擴展組件構成,並且大部分運行時屬性也可以改寫,所以針對服務模型層的擴展具體體現在:根據具體的需要定義相應的組件,並以某種情形將這些自定義的組件應用到運行時框架相應的地方,或者按照我們希望的方式定製相應的運行時屬性。
而WCF為我們提供兩種典型的應用自定義組件或者修改運行時屬性的形式,即通過定義相應的行為(服務行為、終結點行為、契約行為和操作行為)和自定義ServiceHost,我們也把它們稱為WCF的兩種擴展形式。我們先來介紹WCF的四大行為。
作為最為常用的擴展方式,WCF的四大行為的使用主要體現在兩個方麵:其一、WCF自身提供的很多特性和功能是通過行為的方式來實現的;其二、作為使用WCF的應用,可以通過自定義的行為來實現解決具體問題的擴展。
根據應用目標的範圍的不同,WCF具有四種類型的行為:服務行為、終結點行為、契約行為和操作行為,它們的名稱體現了行為本身的作用範圍。對於WCF的這四種行為,讀者肯定不會感到陌生。因為WCF提供的很多功能和特性都是通過相應的行為來實現的。不過,為了讓讀者對行為的本質有一個深刻的認識,能夠幫助讀者能夠選擇正確的行為類型來實現擴展,我們對WCF的四大行為作一個係統的介紹。
對於WCF的四種類型的行為,它們均具有各自接口。除了服務行為隻是應用於服務端之外,終結點行為、契約行為和操作行為都可以同時應用於服務端和客戶端。所以後者具有相同的方法定義。
1: public interface IEndpointBehavior
2: {
3: void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters);
4: void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime);
5: void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher);
6: void Validate(ServiceEndpoint endpoint);
7: }
8:
9: public interface IContractBehavior
10: {
11: void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters);
12: void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime);
13: void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime);
14: void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint);
15: }
16: public interface IOperationBehavior
17: {
18: void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters);
19: void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation);
20: void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation);
21: void Validate(OperationDescription operationDescription);
22: }
上麵的代碼給出了基於終結點行為、契約行為和操作行為相應接口的定義,從中我們可以看到它們具有四個相同的方法。
- Validate:驗證相應的描述(ServiceEndpoint、ContractDescription和OperationDescription)是否符合要求;
- AddBindingParameters:向綁定上下文中添加相應的綁定參數,這些參數一般提供給自定義的綁定元素,並最終被相應的信道獲取以控製對消息的操作;
- ApplyDispatchBehavior:將擴展應用到服務端分發運行時;
- ApplyClientBehavior:將擴展應用到客戶端運行時。
由於服務行為僅僅提供針對服務端的擴展實現,所以基於服務行為的接口並沒有定義ApplyClientBehavior方法,下麵的代碼片斷提供了服務行為接口IServiceBehavior的定義。
1: public interface IServiceBehavior
2: {
3: void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase,
4: Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters);
5: void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase);
6: void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase);
7: }
WCF四種類型的行為都屬於是“服務描述”的範疇,所以ServiceDescription、ServiceEndpoint、ContractDescription和OperationDescription均具有一個Behaviors的屬性。如下麵的代碼片斷所示,這些屬性的類型都是KeyedByTypeCollection<T>,而泛型類型分別為上述的四個行為接口。
1: public class ServiceDescription
2: {
3: //其他成員
4: public KeyedByTypeCollection<IServiceBehavior> Behaviors { get; }
5: }
6: public class ServiceEndpoint
7: {
8: //其他成員
9: public KeyedByTypeCollection<IEndpointBehavior> Behaviors { get; }
10: }
11: public class ContractDescription
12: {
13: //其他成員
14: public KeyedByTypeCollection<IContractBehavior> Behaviors { get; }
15: }
16: public class OperationDescription
17: {
18: //其他成員
19: public KeyedByTypeCollection<IOperationBehavior> Behaviors { get; }
20: }
如果要理解此四種類型的行為是如何實現對WCF的擴展的,就必須了解定義在行為中的這些方法執行的時機。那麼我們就來談論一下這些行為方法在服務端和客戶端究竟是在什麼時候執行的。
。而此時,表示服務描述的ServiceDescription對象已經在初始化ServiceHost的時候被成功創建。具體來說,此三個方法執行的先後順序是先執行Validate方法、然後執行AddBindingParameters方法,最後執行ApplyDispatchBehavior方法。而執行此三個方法的方式都是類似的:
- 通過ServiceDescription的Behaviors得到所有服務行為,並執行每個服務行為的方法;
- 通過ServiceDescription的Endpoints屬性得到服務具有的所有終結點,針對每個表示終結點的ServiceEndpoint對象,通過其Behaviors屬性得到所有終結點行為,並執行終結點行為的方法;
- 針對每一個表示終結點的ServicePoint對象,通過Contract屬性得到表示服務契約描述的ContractDescription對象。通過其Behaviors得到所有的契約行為,並調用每個契約行為的方法;
- 針對每一個表示服務契約描述的ContractDescription對象,通過其Operations屬性得到服務契約所有的操作。針對每個表示操作描述的OperationDescription對象,通過其Behaviors屬性得到所有的操作行為,並調用每個操作行為的方法。
。具體的執行順序為此三個方法執行的先後順序是先執行Validate方法、然後執行AddBindingParameters方法,最後是執行ApplyClientBehavior方法,其執行的方式和服務端完全一致。
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-26 16:04:31