WCF路由截獲消息技巧應用總結
WCF是由微軟公司開發的一款優勢比較突出,能夠為我們帶來一些不一樣使用體驗的開發插件,主要作用于.NET Framework 3.5。WCF是基于消息機制的,一些功能的實現如尋址,加密等在消息中都會體現的淋漓盡致,WCF中的通道就像車間的流水線,而消息就作為這個流水線上待加工的產品。每經過一個處理位置,相應的通道都會對消息對不同的操作處理。清晰的掌握消息的加工過程對WCF的工作原理,調試跟蹤,自定義擴展,性能安全都能非常好的現實意義。而要實現截獲消息的目的,通常可以有以下幾種辦法:#t#
1 WCF路由截獲消息的方法
2 自定義Binding法
3 實現IMessageInspector接口法
4 跟蹤診斷法
四種方法,實現的難度和得到的效果不盡相同。在這里我們主要通過WCF路由截獲消息的方法做一個詳細介紹。
此種方法,有可以分為兩種
a)采用現有tcp消息跟蹤工具。
b) 利用wcf中的路由功能做自定義的路由。
其中常見的現成tcp消息跟蹤工具,我所常用的是以下兩個:
a) tcpTrace
b) soap toolkit 3.0中所帶工具 soap trace utility
通過這兩個工具截獲Message的方法,很多朋友們已經熟練使用。比如很早的時候Artech就在其blog文章中介紹過tcpTrace的使用,文章為:[原創]我的WCF之旅(9):如何在WCF中使用tcpTrace來進行Soap Trace。所以具體使用方法,我就不再贅述。只總結一點,在使用tcpTrace或者soap trace utility 的時候,listen port指定的是路由的監聽地址,同時也應該是client端設置的via地址。而destination port要設置的服務的監聽地址。在上面的途中,listen port 應該為 8019, 而Destination port為8020
除了使用現成的工具來做路由,WCF本身也支持路由功能。實現原理和上圖一致。唯一不同的是中間的路由器可以由自己用WCF技術編寫。這樣一來就更靈活一些。做了一個非常簡單的demo,主要適用于request/reply的交互模式。
demo中有五個項目,他們分別為:
Jillzhang.Wcf.MessageInspectors.Contracts
Jillzhang.Wcf.MessageInspectors.Services
Jillzhang.Wcf.MessageInspectors.Host
Jillzhang.Wcf.MessageInspectors.Client
Jillzhang.Wcf.MessageInspectors.Rounter
前面四個是創建了一個非常簡單的WCF服務和客戶端,組成了一個分布式系統。最關鍵的是Jillzhang.Wcf.MessageInspectors.Rounter這個項目,通過將ServiceContract的Action和ReplyAction設置為* ,同時將其ServiceBehavior的AddressFilterMode設置為Any,就能接收到所有的消息,而不對消息的action或者消息體等進行任何篩選。具體代碼我不貼了,如果感興趣可以下載demo示例代碼。
好了,WCF路由截獲消息的兩種方法都以闡述完畢,那么此種方法有它的優點和缺點,它們分別是:
優點:
1)路由分析法不用過多修改原客戶端和服務端的代碼,和原來架構的耦合度也比較低。
2)路由分析法能夠體現WCF中強大的路由功能。
缺點:
WCF路由截獲消息缺點也非常顯著:
1)它只能截獲到已經發送的請求消息卻不能截獲相應的響應。
2)路由法是在通訊過程中增加了節點,這樣一來就無法使用高效的傳輸安全保證信息的安全性了。