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

Remoting 基本原理與擴充機制 (中-3):ChannelSink 鏈內部實作與 SoapClientFormatterSink

     編輯:關於C語言

InternalInvoke 中的鏈建立邏輯

if (identity.ChannelSink == null)
{
    IMessageSink envoySink = null, channelSink = null;
    if (!identity.ObjectRef.IsObjRefLite())
        RemotingServices.CreateEnvoyAndChannelSinks(null, identity.ObjectRef, out envoySink, out channelSink);
    else
        RemotingServices.CreateEnvoyAndChannelSinks(identity.ObjURI, null, out envoySink, out channelSink);
    RemotingServices.SetEnvoyAndChannelSinks(identity, envoySink, channelSink);
}

channelSink 型別為 IMessageSink 而非 IClientChannelSink,關鍵在於 SoapClientFormatterSink。

SoapClientFormatterSink 雙重介面實作

public class SoapClientFormatterSink : IMessageSink, IClientChannelSink
{
    public IMessage SyncProcessMessage(IMessage msg) { /* 序列化、呼叫 _nextSink、反序列化 */ }
    public void ProcessMessage(...) { throw new NotSupportedException(); } // IClientChannelSink 方法全拋例外
}

為利用 IClientChannelSinkProvider 插入 Pipeline,不得不實作 IClientChannelSink,但實際邏輯在 IMessageSink 中。

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