熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Custom Channel Sinks被我征服了

2013-11-13 09:42:56  來源: .NET編程 

  

  這兩天由於公司業務的需要需要將一項服務放到互聯網上采用的框架 remoting在使用上很簡單功能也很強大是開發分布式應用程序的首選但 remoting框架在傳輸數據時並沒有對數據進行加密處理和身份認真所以這讓我有了數據安全性的擔心

  但 框架確實很強大強大到可以讓你自定義數據傳送的方式所以將安全策略加入到自定義的傳送中是一個不錯的選擇

  但是這個自定義傳送方式讓我研究了天時間我將所有的接口定義都打印出來將在網上找到的一篇關於Custom Channel Sinks的資料也打印了出來一句一句分析最後在今天下班的路上我突然覺得我完全理解了Custom Channel Sink的工作流程知道了如何將安全策略加入到Custom Channel Sink中

  在以後幾天中我會把原理寫在我的blog上希望路過的朋友多多指教

  原理

  當你調用遠程對象時你並沒有直接引用它你引用的是遠程對象在本地的代理代理對象在處理上很像遠程對象它能夠將基於棧的方法調用轉換成消息將其發送給遠程對象為了讓消息發送給遠程對象代理對象要使用到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之前

  上面這些內容看起來很簡單但要把它作出來還需要很多工作你確實可以通 框架輕松實現分布式應用程序的功能但是如果你要自定義其中的部分功能事情就不象想象的那麼容易了(至少不是幾個繼承能夠解決問題的)

  開始艱難之旅

  要實現自定義鏈節首先要實現以下幾個接口
IMessageSinkIClientChannelSinkIServerChannelSinkIClientSinkProviderIServerSinkProvider
雖然我們處理的只是加密問題但是 框架中找不到一個鏈節處理的基類所以下面的路會比較艱難

  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* msg IMessageSink* replaySink)
{
    //處理發送的消息對消息的加密處理在這裡進行
    //創建返回的MessageSink replysink由replaysink來處理返回的消息該線程不必等待消息的回應
    return this>nextMessageSinkAsyncProcessMessage(msg replysink);
}
//執行同步處理
IMessage* IMessageSink::SyncProcessMessage(IMessage* msg)
{
    //處理發送的消息對消息的加密處理在這裡進行
    IMessage* resMsg = this>nextMessageSinkSyncProcessMessage(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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.