接上一篇《Custom Channel Sinks被我征服了》
.Net 的Channel Sink是一個很系統的架構,在瞭解Custom Channel Sink的原理及主要介面後,接下來的內容將討論Channel Sink相關的知識,這也算第二步吧。
在我學習的過程中,我有一個心得想和大家分享:學習的過程是一個登山的過程,你得腳踏實地,一步一步向前,如果你認為這樣的速度很慢,你想找一個“速成”的方法,那麼結果只有一個,你永遠也不能自己爬上去,因為世界上沒有這種方法。
接下來我想討論的是如何建立Channel Sink。Channel Sink分為兩種,一種在用戶端上工作,執行介面為IClientChannelSink;一種在伺服器上工作,執行介面為IServerChannelSink。在這兩個介面中,最關鍵的方法是ProcessMessage。
先看一下IClientChannelSink的ProcessMessage方法定義
void ProcessMessage(
IMessage* msg,
ITransportHeaders* requestHeaders,
Stream* requestStream,
[Out] ITransportHeaders** responseHeaders,
[Out] Stream** responseStream
);
msg:需要處理的訊息
requestHeaders:添加到外發訊息的頭資訊,其目標是伺服器
requestStream:發送到傳輸層的位元組流
以上3個參數是傳入參數,其作用就是將用戶端的資料發往伺服器。下面兩個參數是返回參數,其作用是返回來自伺服器的響應。
responseHeaders:返回來自伺服器的頭資訊
responseStream:返回來自於傳輸層的流
再看一下IServerChannelSink的ProcessMessage方法定義
ServerProcessing ProcessMessage(
IServerChannelSinkStack* sinkStack,
IMessage* requestMsg,
ITransportHeaders* requestHeaders,
Stream* requestStream,
[Out] IMessage** responseMsg,
[Out] ITransportHeaders** responseHeaders,
[Out] Stream** responseStream
);
sinkStack:被當前Channel Sink所調用的Channel Sinks棧
requestMsg:包含請求的訊息
requestHeaders:從來自於用戶端的訊息中檢索出來的頭資訊
requestStream:需要被處理然後傳輸給還原序列化Sink的流
以上3個參數為傳入參數,處理的是從用戶端發送過來的資料,以下三個參數為返回參數,處理的是伺服器的處理結果,要返回給用戶端的資料。
responseMsg:返回伺服器的回應訊息
responseHeaders:返回傳往用戶端的頭資訊
responseStream:返回傳送給傳輸Sink到用戶端的流。
從上面的分析,我們可以很直觀的發現,用戶端的ProcessMessage方法和伺服器端的ProcessMessage方法構成了一個訊息處理環。其處理順序為:用戶端調用代理對象->[用戶端的Sinks].ProcessMessage->[伺服器端的Sinks].ProcessMessage->伺服器建立堆棧處理資料->[伺服器端Sinks].ProcessMessage->[用戶端的Sinks].ProcessMessage->用戶端調用代理對象傳回值。在上面的順序表達中,用戶端和伺服器端的ProcessMessage順然都被標註了兩次,實際上他們只執行了一次,第二次標註,實際上是第一次調用的返回,其傳回值就是上面提到的out參數。
---------------------------
這一節就寫道這裡吧,還是由於工作原因,不能靜下心來寫blog,之所以寫在這裡,也是想和關注.net remoting架構的朋友交流一下,剩下的還是下周寫出來,有什麼問題,請QQ聯絡我:64528619,歡迎批評!