天天看點

信道(Channel)、接收器(Sink)、接收鍊(Sink Chain)和信道接受提供程式(Channel Sink Provider)

為了擴充.Net Remoting,定制接收器(Sink)和信道接受提供程式(Channel Sink Provider),改變.Net Remoting的預設行為,需要先了解.Net Remoting的相關概念及其運作機制。

下面先了解一些基本概念:

信道(Channel)-是跨遠端處理邊界(無論是在應用程式域、程序還是計算機之間)在應用程式之間傳輸消息的對象。信道可以在終結點上偵聽入站消息,向另一個終結點發送出站消息,或者兩者都可以。

信道必須實作 IChannel 接口,該接口提供諸如 ChannelName 和 ChannelPriority 這樣的屬性。專用于在特定端口上偵聽特定協定的信道實作 IChannelReceiver,而專用于發送資訊的信道實作 IChannelSender(注:IChannelReceiver和IChannelSender接口都繼承IChannel 接口)。TcpChannel 和 HttpChannel 對象都實作這兩種接口,是以它們可用于發送或接收資訊。

.Net Remoting Framework提供了TcpChannel 和 HttpChannel兩個信道的實作。

在發送消息之前或接收消息之後,信道(Channel)沿着信道接收對象鍊(a chain of channel sink objects)發送每個消息。該接收鍊(sink chain)包含基本信道功能所需的接收器(Sink)(如格式化程式接收器FormatterSink、傳輸接收器TransportSink或堆棧生成器接收器StackBuilderSink),但是您可以自定義信道接收鍊以便用消息或流執行特殊任務。

信道接收鍊(Sink Chain)處理任何發送到應用程式域或從應用程式域發送的消息。此時,您隻有消息,但是您可以任意操作該消息,而後面的處理将使用您在處理之後傳回給系統的消息。這是實作日志記錄服務、任何種類的篩選器或者用戶端或伺服器上的加密或其他安全措施的理所當然的位置。以下插圖顯示基本信道接收鍊的結構。

每個信道接收器(Channel Sink)都處理流,然後将流傳遞到下一個信道接收器,這意味着您的接收器之前或之後的對象應當知道該如何處理傳遞給它們的流。(Sink/Channel Sink是同一個描述。)

StackBuilderSink 對象是伺服器上遠端對象前的最後一個消息接收器。

每個信道接收器(Channel Sink)或者實作 IClientChannelSink,或者實作 IServerChannelSink。用戶端上的第一個信道接收器還必須實作 IMessageSink。它通常實作IClientFormatterSink(它從 IMessageSink、IChannelSinkBase 和 IClientChannelSink 繼承),并被稱作格式化程式接收器(Formatter Sink),因為它将傳入的消息轉換為流(IMessage 對象)。

信道接收提供程式(Channel Sink Provider)-(實作 IClientChannelSinkProvider、IClientFormatterSinkProvider 或 IServerChannelSinkProvider 接口的對象)負責建立遠端處理消息所流過的信道接收器(Channel Sink)。當遠端類型被激活後,将從信道(Channel)中檢索信道接收提供程式(Channel Sink Provider);然後在該接收提供程式上調用CreateSink 方法以檢索鍊上的接收器中的第一個Sink。

信道接收器(Channel Sink)還負責在用戶端和伺服器之間傳輸消息。信道接收器也連結在一起而形成一個鍊。當在接收提供程式上調用 CreateSink 方法時,該方法應該執行以下操作:

·         建立它自己的信道接收器。

·         在鍊中的下一個接收提供程式上調用 CreateSink。

·         確定下一個接收器和目前的接收器連結在一起。

·         将其接收器傳回到調用方。

信道接收器負責将在它們上面進行的所有調用轉發到鍊中的下一個接收器,并且應當提供用于存儲對下一個接收器的引用的機制。

自定義信道接收器(Custom Channel Sinks)

自定義信道接收器被插入到格式化程式接收器(FormatterSink)和最後一個傳輸接收器(TransportSink)之間的對象鍊中。

傳輸接收器(TransportSink)

傳輸接收器是用戶端上的鍊中最後一個接收器和伺服器端上的鍊中第一個接收器。除了傳輸序列化的消息,傳輸接收器還負責将标頭(Header)發送到伺服器并在調用從伺服器傳回時檢索标頭和流。這些接收器内置在信道中,并且無法擴充。

簡要總結.Net Remoting Infrastructure機制:

1,代理對象(Proxy)負責轉發對Remote Objects的調用。

2,消息對象(Message Objects)用來調用Remote Methods的資料。

3,信道接收器(Sink/Channel Sink)用來遠端方法調用(Remote method calls)處理消息。

4,信道接收提供程式(Channel Sink Provider)-一般用來将接收器(Sink)插入到信道接收鍊(Sink Chain)中。

5,格式化程式接收器FormatterSink-用來序列化/反序列化消息格式,進行傳遞。

6,傳輸接收器TransportSink-用來在程序或AppDomain之間傳遞序列化的消息。

Reference:

1, MSDN, .NET Framework 開發員指南, 接收器和接收鍊