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

WCF 分散式開發必備知識 (二):.NET Remoting 架構與三通道實作

     編輯:關於.NET

.NET Remoting 定位

分散式處理機制,適用 .NET 平台間 程式通訊,不支援離線訊息。可視為 DCOM 的 .NET 升級版,極佳融合於 .NET 生態。核心價值:跨越 AppDomain 邊界 進行物件互動 (OS 進程隔離保護機制下的受控穿透)。

通訊架構

Remoting 通訊架構

四大核心概念

1. 通道 - 跨域傳輸管道

通道協定宿主安全性參數
HttpChannelHTTPASP.NET可用 HTTP 加密主機名 + 埠號
TcpChannelTCP SocketWindows Service / EXE無內建安全主機名 + 埠號
IpcChannelNamed Pipe同機器進程間無內建安全管道名 (無需主機/埠)
自訂通道UDP/SMTP/MSMQ 等任意自行實作自訂

2. 遠端物件 - 需繼承 MarshalByRefObject

客戶端取得的不是實體物件,而是透明代理,經真實代理 → 通道 → 伺服端物件。

3. 啟動模式

  • 伺服器啟動:
    • Singleton (單例/有狀態):所有客戶端共享同一實例。
    • SingleCall (無狀態):每次呼叫建立新實例,GC 回收。
  • 客戶端啟動:每客戶端專屬實例,可傳遞建構函式參數,生命週期可控 (Lease-based)。

4. 代理分層

透明代理 (客戶端) → Invoke → 真實代理 → 訊息沉澱器 → 通道 → 伺服端。

完整三專案實作

1. 遠端物件組件

namespace RemoteObject
{
    public class MyRemoteObject : MarshalByRefObject
    {
        public int AddForTcpTest(int a, int b) => a + b;
        public int MinusForHttpTest(int a, int b) => a - b;
        public int MultipleForIpcTest(int a, int b) => a * b;
    }
}

2. 伺服器宿主 (主控台)

static void Main()
{
    // 註冊三種通道
    ChannelServices.RegisterChannel(new TcpChannel(10001));
    ChannelServices.RegisterChannel(new HttpChannel(10002));
    ChannelServices.RegisterChannel(new IpcChannel("FrankTestIpc"));

    // 註冊 WellKnown 服務 (Singleton)
    RemotingConfiguration.RegisterWellKnownServiceType(
        typeof(RemoteObject.MyRemoteObject),
        "RemoteObject.MyRemoteObject",
        WellKnownObjectMode.Singleton);

    Console.WriteLine("Server ready. Press any key to exit.");
    Console.ReadLine();
}

3. 客戶端配置與呼叫

App.config

<appSettings>
  <add key="ServiceURLTcp" value="tcp://localhost:10001/RemoteObject.MyRemoteObject" />
  <add key="ServiceURLHttp" value="https://localhost:10002/RemoteObject.MyRemoteObject" />
  <add key="ServiceURLIpc" value="ipc://FrankTestIpc/RemoteObject.MyRemoteObject" />
</appSettings>

呼叫代碼

static void Main()
{
    try
    {
        var tcpProxy = (RemoteObject.MyRemoteObject)Activator.GetObject(
            typeof(RemoteObject.MyRemoteObject),
            ConfigurationSettings.AppSettings["ServiceURLTcp"]);
        Console.WriteLine("TCP: 100+200 = {0}", tcpProxy.AddForTcpTest(100, 200));

        var httpProxy = (RemoteObject.MyRemoteObject)Activator.GetObject(
            typeof(RemoteObject.MyRemoteObject),
            ConfigurationSettings.AppSettings["ServiceURLHttp"]);
        Console.WriteLine("HTTP: 100-200 = {0}", httpProxy.MinusForHttpTest(100, 200));

        var ipcProxy = (RemoteObject.MyRemoteObject)Activator.GetObject(
            typeof(RemoteObject.MyRemoteObject),
            ConfigurationSettings.AppSettings["ServiceURLIpc"]);
        Console.WriteLine("IPC: 100*200 = {0}", ipcProxy.MultipleForIpcTest(100, 200));
    }
    catch (Exception e) { throw e; }
    Console.ReadLine();
}

執行結果

伺服器:三通道註冊成功。
客戶端:三通道分別呼叫遠端方法運算成功。

伺服器輸出

客戶端輸出

進階主題預告

非同步呼叫、安全性、Lease 生命週期管理、自訂沉澱器。下一篇將介紹 Enterprise Services 與 COM+ 事務機制。

完整代碼下載:Remoting.rar

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