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

.NET Remoting 雙向通訊實作:伺服器回呼客戶端完整指南

     編輯:關於.NET

.NET Remoting 內建支援雙向通訊,讓伺服器端物件在執行期間回呼客戶端物件方法。本文以「計算機回呼顯示結果」為例,逐步建構完整方案。

架構設計:四個專案

專案類型職責
Artech.DuplexRemoting.ContractClass Library定義遠端物件與回呼介面
Artech.DuplexRemoting.RemotingClass Library實作遠端物件
Artech.DuplexRemoting.HostingConsole AppSelf-Host 遠端物件
Artech.DuplexRemoting.ClientConsole App實作回呼物件並呼叫遠端

介面定義 (Contract 專案)

// IDuplexCalculator.cs
public interface IDuplexCalculator
{
    void Add(double x, double y, ICalculatorCallback callback);
}

// ICalculatorCallback.cs
public interface ICalculatorCallback
{
    void ShowResult(double x, double y, double result);
}

伺服端實作 (Remoting 專案)

public class DuplexCalculatorRemoting : MarshalByRefObject, IDuplexCalculator
{
    public void Add(double x, double y, ICalculatorCallback callback)
    {
        Console.WriteLine($"Invoke Add({x}, {y})");
        double result = x + y;
        callback.ShowResult(x, y, result); // 回呼客戶端
    }
}

Self-Host 設定 (Hosting 專案)

<configuration>
  <system.runtime.remoting>
    <application name="Calculator">
      <service>
        <wellknown mode="SingleCall"
            type="Artech.DuplexRemoting.Remoting.DuplexCalculatorRemoting, Artech.DuplexRemoting.Remoting"
            objectUri="DuplexCalculator.soap" />
      </service>
      <channels>
        <channel ref="http" port="8080">
          <serverProviders>
            <provider ref="wsdl" />
            <formatter ref="binary" typeFilterLevel="Full" /> <!-- 關鍵 -->
          </serverProviders>
          <clientProviders>
            <formatter ref="binary" />
          </clientProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

關鍵點:

  • 使用雙向通道 (HTTP/TCP)。
  • typeFilterLevel="Full":預設 Low 會拒絕反序列化 MarshalByRefObject 衍生類別 (回呼物件)。

客戶端實作 (Client 專案)

回呼物件

public class CalculatorCallbackHandler : MarshalByRefObject, ICalculatorCallback
{
    public void ShowResult(double x, double y, double result)
    {
        Console.WriteLine($"x + y = {result} where x = {x} and y = {y}");
    }
}

Client 設定檔

<configuration>
  <system.runtime.remoting>
    <application>
      <channels>
        <channel ref="http" port="0"> <!-- 0 = 動態配埠 -->
          <clientProviders>
            <formatter ref="binary" />
          </clientProviders>
          <serverProviders> <!-- 客戶端也需 serverProviders 接收回呼 -->
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

呼叫程式碼

RemotingConfiguration.Configure("Client.exe.config", false);
IDuplexCalculator proxy = (IDuplexCalculator)Activator.GetObject(
    typeof(IDuplexCalculator), "https://localhost:8080/Calculator/DuplexCalculator.soap");
proxy.Add(1, 2, new CalculatorCallbackHandler());
Console.Read();

部署至 IIS

  1. IIS 建立虛擬目錄指向 Remoting 專案資料夾。
  2. 於虛擬目錄根目錄放置 Web.config,內容同 Hosting 的 system.runtime.remoting 區段,補充 system.web/assemblies 參考。
  3. Client 端位址改為 https://localhost/虛擬目錄/DuplexCalculator.soap,無需 Hosting 專案即可運作。

核心觀念總結

  • 回呼物件必須繼承 MarshalByRefObject,才能跨 AppDomain 被遠端呼叫。
  • 雙向通訊本質上是角色互換:伺服器變客戶端、客戶端變伺服器,雙方皆需註冊通道與 typeFilterLevel="Full"。
  • Self-Host 與 IIS Host 設定邏輯一致,差異在啟動方式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved