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

.NET Remoting 遠程方法調用深度解析:架構、代理與序列化機制

     編輯:關於.NET

前言

遠程方法調用(RMI)發展至今,歷經 DCE/RPC、CORBA、DCOM、MTS/COM+、Java RMI/EJB、Web Services/SOAP 等框架。本文聚焦 .NET Remoting,剖析其原理、實作細節,並與微軟早期 COM/DCOM 技術進行對比。

.NET Remoting 框架概覽

Microsoft .NET Remoting 提供跨應用程式域的物件互動框架。相較於 Web Service 僅支援簡單的跨平台/跨語言呼叫,.NET Remoting 如同 ASP 之於 CGI,帶來質的飛躍:

  • 可擴展架構:可換裝傳輸通道(內建 HTTP/TCP)、編碼格式(SOAP/二進位)、安全性(IIS/SSL)。
  • 豐富服務:物件啟動模式、生命週期管理、租約機制。
  • 型別保真:在 CLR 托管環境下,享有「多型別保真」,消除早期 RPC 的型別不匹配問題。

遠程調用的五大核心要素

要素角色
Proxy(代理)客戶端偽裝成遠端物件,轉發呼叫給 Remoting 框架。
Message(訊息)封裝方法呼叫所需的參數、屬性等資料。
Message Sink / Channel Sink(訊息槽/通道槽)攔截並自訂訊息處理管線,提供擴充點。
Formatter(格式化器)將 Message 序列化為網路傳輸格式(SOAP、Binary)。
Transport Channel(傳輸通道)負責將序列化訊息傳送至遠端處理序(HTTP、TCP)。

代理機制深度剖析

TransparentProxy 與 RealProxy

  • 客戶端持有 TransparentProxy,其介面與遠端物件完全一致。
  • 所有方法呼叫被 CLR 攔截,封裝為 IMessage 轉交 RealProxy。
  • RealProxy 負責跨應用程式域/處理序轉發訊息。
// 客戶端啟動遠端物件典型代碼
HttpChannel channel = new HttpChannel();
ChannelServices.RegisterChannel(channel);
SomeClass obj = (SomeClass)Activator.GetObject(
    typeof(SomeClass),
    "https://localhost:1234/SomeSAO.soap");

訊息流向與 SOAP 封包實例

一次 setValue(42) 呼叫經過 HTTP Channel 後的 SOAP 封包:

POST /MyRemoteObject.soap HTTP/1.1
SOAPAction: "https://schemas.microsoft.com/clr/nsassem/General.BaseRemoteObject/General#setValue"
Content-Type: text/xml; charset="utf-8"

<SOAP-ENV:Envelope ...>
  <SOAP-ENV:Body>
    <i2:setValue id="ref-1">
      <newval>42</newval>
    </i2:setValue>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

序列化機制:Formatter 與 Sink Chain

.NET Remoting 以 Formatter 取代 COM 複雜的 Marshaling/Unmarshaling:

  • 內建 SoapFormatter(XML)與 BinaryFormatter(二進位)。
  • 訊息經 IMessageSink 前處理鏈 → SyncProcessMessage → Formatter 序列化。
  • 客戶端 SoapClientFormatterSink 呼叫 SerializeMessage,最終由 CoreChannel.SerializeSoapMessage 完成。

自訂 Sink 範例:壓縮通道

實作 IClientChannelSink 即可在訊息管線中插入壓縮邏輯,展現框架極高擴充性:

public class CompressionClientSink : BaseChannelSinkWithProperties, IClientChannelSink
{
    private IClientChannelSink _nextSink;
    public CompressionClientSink(IClientChannelSink next) { _nextSink = next; }
    public IClientChannelSink NextChannelSink => _nextSink;

    public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg,
        ITransportHeaders headers, Stream stream)
    {
        // TODO: 壓縮前處理
        sinkStack.Push(this, null);
        _nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream);
    }
    // ... 其他介面成員省略
}

.NET Remoting vs DCOM vs Web Service 選型建議

「若需跨異構系統互操作,請選 Web Service(SOAP/XML/HTTP);若雙端皆為 CLR 托管元件,.NET Remoting 可能是更佳選擇。」

結語

.NET Remoting 以簡潔的 Proxy/Message/Sink 架構、強大的型別系統與高度可擴展的管線設計,重新定義了 .NET 平台上的分散式物件呼叫。雖然 WCF 後來統一了通訊模型,但理解 Remoting 核心機制仍有助於深入掌握 .NET 分散式運算本質。

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