.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).