.NET Remoting

.NET远程处理[1].NET Remoting )是微软 .NET Framework 中的一种网络通信技术,与 XML Web Service 不同的是,它可以使用 SOAP 以外的协议来通信,而在服务端和客户端之间所操作的方法近乎相同,客户端可以不必考虑使用的协议,即可访问服务端所开放的对象。这个技术与是由Distributed COM所发展而来的,与DCOM最大的不同是,DCOM有限制使用 TCP Port,但.NET Remoting 可以选择使用 TCP 或 HTTP 的方式通信,而资料可以利用 SOAP 或二进制传输方式在网络上流动,二进制的传输性能是 SOAP 所不能比的,但 SOAP 却可以得到和 Web Service 相互沟通的能力,因此 .NET Remoting 的设计弹性较大。

.NET Remoting 架构

.NET Remoting 技术目前已集成到 Windows Communication Foundation 中。

原理

.NET Remoting 使用了 信道序列化 机制来串接两台机器间的对象,信道是负责处理网络通信的部分,而序列化则是处理对象与流资料的处理工作。

  • 信道支持了 IPC(进程间通信)、TCP 与 HTTP 通信协议[2]
  • 序列化支持二进制(binary)或 XML(SOAP)通信协议的资料流[3]

当服务端设置好使用的通道以及协议后,客户端必须要跟随服务端的设置,并且依服务端决定的活化模型来启动,而程序设计的方法和一般调用组件般简单。

public static void Main()
{
   RemotingConfiguration.Configure("Client.exe.config"); // 读取设置
   RemotableType remoteObject = new RemotableType(); // 创建可远程处理对象
   Console.WriteLine(remoteObject.SayHello()); // 调用远程方法
}

配置设置

.NET Remoting 的设计理念,就是为了要简化网络上的对象通信,而且要让开发人员不必太过于在通信的底层伤脑筋,因此在网络通信协议上做了许多的包装,并且允许在 Configuration File(app.config)中直接设置,或是由 .NET Remoting 的 Configuration API 来设置即可,故配置设置的选项复杂度较高,设计较复杂的 .NET Remoting 应用程序在配置的设置上往往会相当复杂。

以下为设置 .NET Remoting 客户端的示例设置:

<configuration>
   <system.runtime.remoting>
      <application>
         <client>
            <wellknown 
               type="RemotableType, RemotableType"
               url="http://localhost:8989/RemotableType.rem"
            />
         </client>
      </application>
   </system.runtime.remoting>
</configuration>

活化模型

活化(Activation)是指客户端启动服务端组件的方式,.NET Remoting 中支持了两种方式[4]

  • Single-Call:在每一次客户端调用时都生成一个执行个体。
  • Single-ton:在第一次调用时就生成执行个体,之后每一次调用都使用相同的执行个体。

对象传递

在 .NET Remoting 中,不论是传值或传址,每一个对象都必须要继承 System.MarshalByRefObject 类别,才可以利用 .NET Remoting 来传输[5]

以下代码为服务端的 Remoting 组件:

// RemotableType.cs
using System;
public class RemotableType : MarshalByRefObject // Remoting 物件必須繼承自 System.MarshalByRefObject 類別。
{
    public string SayHello()
    {
        Console.WriteLine("RemotableType.SayHello() was called!");
        return "Hello, world";
    }
}

参考资料

  1. ^ .NET 远程处理. [2013-01-03]. (原始内容存档于2013-05-11). 
  2. ^ Channels. [2008-09-30]. (原始内容存档于2016-04-02). 
  3. ^ Serialization Formatters. [2008-09-30]. (原始内容存档于2016-05-09). 
  4. ^ Activation of Remote Objects. [2008-09-30]. (原始内容存档于2008-10-18). 
  5. ^ Making Object Remotable. [2008-09-30]. (原始内容存档于2010-01-23).