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。
public class SoapClientFormatterSink : IMessageSink, IClientChannelSink
{
public IMessage SyncProcessMessage(IMessage msg) { /* 序列化、呼叫 _nextSink、反序列化 */ }
public void ProcessMessage(...) { throw new NotSupportedException(); } // IClientChannelSink 方法全拋例外
}
為利用 IClientChannelSinkProvider 插入 Pipeline,不得不實作 IClientChannelSink,但實際邏輯在 IMessageSink 中。