首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Remoting 基本原理與擴充機制 (中-4):IClientChannelSinkProvider 擴充 MessageSink

     編輯:關於C語言

ChannelSink 鏈建立流程

在 InternalInvoke 中,透過 SetEnvoyAndChannelSinks 將 channelSink 串接至 RemotingProxy 的 identity._channelSink,形成可被代理存取的鏈結。

序列圖:遠端方法呼叫流程

遠端呼叫序列圖

RemotingProxy.CallProcessMessage(identity.ChannelSink, reqMsg, ...) 將訊息交給第一個 IMessageSink 處理。雖由 IClientChannelSinkProvider 建立,但鏈頭實為 IMessageSink,故 SoapClientFormatterSink(實作 IMessageSink)可正常運作。

設定檔順序關鍵

  • 用戶端:自訂 SinkProvider 必須置於 <formatter ref="soap"/> 之前,才能在格式化前攔截訊息。
  • 伺服器端:順序相反。
<channel ref="http">
  <clientProviders>
    <provider type="CustomSinks.CustomSinkProvider,CustomSinks" />
    <formatter ref="soap" />
  </clientProviders>
</channel>

總結

利用 IClientChannelSinkProvider 插入 IMessageSink,可在訊息序列化前攔截修改,實現強大的 AOP 風格擴充。下一節將探討同一 AppDomain 內的攔截機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved