這兩天由於公司業務的需要
但 框架確實很強大
但是這個自定義傳送方式讓我研究了
在以後幾天中
原理
當你調用遠程對象時
你並沒有直接引用它 你引用的是遠程對象在本地的代理 代理對象在處理上很像遠程對象 它能夠將基於棧的方法調用轉換成消息 將其發送給遠程對象 為了讓消息發送給遠程對象 代理對象要使用到Sink Chain(可以看成是數據處理鏈) 首先 代理對象會調用第一個鏈節 將數據傳給它 第一個鏈節獲取數據後 對數據做進行處理 然後再將數據傳遞給下一個鏈接 以此類推 在處理鏈中 有一個鏈節是formatter sink(格式處理鏈節) 其功能是將消息數據轉換為stream(流) 之所以要在在格式鏈節處理數據之後 再將數據傳遞給下一個鏈節進行處理 是因為在這個節點 消息已經不再和數據類型相關 此刻的數據表現形勢只是二進制字節流(我們可以對它做任何處理 對吧) 最後一個鏈節是Transports Sink 它的功能是將數據發送到服務器並等待回應 當它收到回應後 它會將數據傳遞前一個鏈節 直到最開始的那個鏈節將數據傳遞給代理對象 當數據發送到服務器端後
服務器端也有一個Sink Chain 它的節點與客戶端上的節點一致 只是順序相反 在服務器上 處理數據的第一個節點是Transport Sink 數據沿著Sink Chain傳遞到真正的遠程數據處理對象 客戶端
代理對象 >formatter sink >transport sink
服務器端transport sink > formatter sink > 遠程目標對象 在這個處理鏈中
我們可以加入自定義的鏈節 加入自定義鏈節的目的很多 而我所需要的是保證數據在網絡上傳輸的安全性 在上面我們已經意識到 當消息經過formatter sink處理後 就以字節流的形式體現 而對字節的加密處理 對程序員來說是再簡單不過的事情 所以 我要做的 就是在客戶端 將加密處理鏈節加到formatter sink之後 在服務器端 將解密處理鏈節加到formatter sink之前 上面這些內容看起來很簡單
但要把它作出來 還需要很多工作 你確實可以通 框架輕松實現分布式應用程序的功能 但是如果你要自定義其中的部分功能 事情就不象想象的那麼容易了(至少不是幾個繼承能夠解決問題的)
開始艱難之旅
要實現自定義鏈節
首先要實現以下幾個接口
IMessageSinkIClientChannelSink IServerChannelSink IClientSinkProvider IServerSinkProvider
雖然我們處理的只是加密問題但是 框架中 找不到一個鏈節處理的基類 所以下面的路會比較艱難 IMessageSink
屬性
NextSink獲取處理鏈中的下一個鏈節
方法
AsyncProcessMessage異步處理獲取的消息
SyncProcessMessage同步處理獲取得消息 IClientChannelSink
屬性
NextChannelSink獲取客戶端處理鏈節中的下一個鏈節
方法
AsyncProcessRequest在當前的處理鏈節中 請求異步數據處理
AsyncProcessResponse在當前的處理鏈節中 請求異步回應
GetRequestStrean返回字節流到即將被序列化的消息上
ProcessMessage從當前的處理鏈節中 請求消息處理 IServerChannelSink
屬性
NextChannelSink獲取服務器端處理鏈節中的下一個鏈節
方法
AsyncProcessResponse異步處理回應消息
GetResponseStream返回流到即將被序列化的消息上
ProcessMessage從當前鏈節請求消息處理
在上面幾個接口中
最重要的是IMessageSink 這個接口的同步處理與異步處理都要實現 以下是偽代碼
public __gc class BaseSink : IMessageSink
{
Private:
IMessageSink* nextMessageSink;
public:
//執行異步處理
IMessageCtrl* IMessageSink::AsyncProcessMessage(IMesage* msgIMessageSink* replaySink)
{
//處理發送的消息對消息的加密處理在這裡進行
//創建返回的MessageSinkreplysink 由replaysink 來處理返回的消息 該線程不必等待消息的回應
return this>nextMessageSink AsyncProcessMessage(msg replysink );
}
//執行同步處理
IMessage* IMessageSink::SyncProcessMessage(IMessage* msg)
{
//處理發送的消息對消息的加密處理在這裡進行
IMessage* resMsg = this>nextMessageSink SyncProcessMessage(msg);//獲取返回的消息 線程在這裡等待回應
//處理返回的消息並返回處理後的消息 對消息的解密處理在這裡進行
}
__property IMessageSink* IMessageSink::get_NextSink()
{
return this>nextMessageSink;
}
}在這裡
萬裡長征終於走出了堅實的第一步了 攻克了IMessageSink 相信後面的那幾個接口會很好搞定 作為
Net框架中強大的一部分 Channel Sink不可能就了了幾字可以說完 第二步如何走 請看Custom Channel Sink征服之旅二 附
如果本文有遺漏的地方 請指正 謝謝 聯系QQ
From:http://tw.wingwit.com/Article/program/net/201311/11395.html