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