Custom Channel Sinks被我征服了

2021-04-08 13:02:14 字數 2573 閱讀 2695

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

但是.net 框架確實很強大,強大到可以讓你自定義資料傳送的方式,所以將安全策略加入到自定義的傳送中是乙個不錯的選擇。

但是這個自定義傳送方式讓我研究了2天時間,我將所有的介面定義都列印出來,將在網上找到的一篇關於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之前。

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

開始艱難之旅

要實現自定義鏈節,首先要實現以下幾個介面:

imessagesink,iclientchannelsink,iserverchannelsink,iclientsinkprovider,iserversinkprovider

雖然我們處理的只是加密問題,但是在.net 框架中,找不到乙個鏈節處理的基類,所以下面的路會比較艱難。

imessagesink:

屬性:nextsink:獲取處理鏈中的下乙個鏈節

方法:asyncproces**essage:非同步處理獲取的訊息

syncproces**essage:同步處理獲取得訊息

iclientchannelsink:

屬性:nextchannelsink:獲取客戶端處理鏈節中的下乙個鏈節

方法:asyncprocessrequest:在當前的處理鏈節中,請求非同步資料處理

asyncprocessresponse:在當前的處理鏈節中,請求非同步回應

getrequeststrean:返回位元組流到即將被序列化的訊息上

proces**essage:從當前的處理鏈節中,請求訊息處理

iserverchannelsink:

屬性:nextchannelsink:獲取伺服器端處理鏈節中的下乙個鏈節

方法:asyncprocessresponse:非同步處理回應訊息

getresponsestream:返回流到即將被序列化的訊息上

proces**essage:從當前鏈節請求訊息處理

在上面幾個介面中,最重要的是imessagesink。這個介面的同步處理與非同步處理都要實現。以下是偽**:

public __gc class basesink : imessagesink

//執行同步處理

imessage* imessagesink::syncproces**essage(imessage* msg)

__property imessagesink* imessagesink::get_nextsink()

}在這裡,萬里長征終於走出了堅實的第一步了,攻克了imessagesink,相信後面的那幾個介面會很好搞定。

作為.net框架中強大的一部分,channel sink不可能就了了幾字可以說完。第二步如何走,請看custom channel sink征服之旅二

終於被我找到了

一直在考慮vc6自帶的stl和他自己的容器類是不是執行緒安全的,安全到我拿多個執行緒,這邊寫那邊讀,這邊寫那邊寫都可以不考慮會不會出現race condition,我測了幾把竟然都能得到正確的結果,鬱悶 終於發現了一篇文字如下 在所有的主流 stl實現方案中,幾乎所有的容器都是執行緒安全的 1 乙個...

不幸被我言中了

當初辦開玩笑的說,我們應該把 敏捷 註冊為商標,然後說別人早晚會這麼做的。後來一想,這個事情還真不是玩笑。果然今天scrum聯盟就這麼搞了一下。不是我多牛,而是有時候看得多了,自然就能有些感覺事情會如何發展。畢竟這些事情都有個套路,今天他們做了這個事情,明天他們做那個事情的可能性就大大增高了。我無法...

征服C指標

更多關於 征服c指標 內容簡介 計算機書籍 征服c指標 被稱為日本最有營養的c 參考書。作者是日本著名的 毒舌程式設計師 其言辭犀利,觀點鮮明,往往能讓讀者迅速領悟要領。征服c指標 中結合了作者多年的程式設計經驗和感悟,從c 語言指標的概念講起,通過實驗一步一步地為我們解釋了指標和陣列 記憶體 資料...