.NET Remoting技术连载(一)

来源:互联网 发布:2015中国经济数据 编辑:程序博客网 时间:2024/05/16 19:51

 如何生成基本的 .NET Framework 远程处理应用程序
  一、实现一个基本的.NET Framework Remoting 程序:
   
1、实现可远程处理的类型;
    2、
宿主应用程序域(用于侦听);
    3、
客户端应用程序域(用于调用);
    4、配置每个应用程序域中的远程处理系统(以便将远程激活用于可远程处理的类型)。

  二、生成可远程处理的类型:
  要使其他应用程序域中的对象能够使用您的类的实例,该类必须从 MarshalByRefObject 继承。
    1. 定义一个从 MarshalByRefObject 类派生的类
    2. 就像对待非可远程处理的类型一样,实现该类的方法和属性。要使其他应用程序域中的对象能够在远程创建该对象的实例,必须生成宿主或侦听器应用程序,以完成以下两项任务:
    1. 选择并注册一个信道,该信道是处理网络协议和序列化格式的对象。
 
  2. 类型注册到 .NET 远程处理系统,使它可以使用信道来侦听对类型的请求。 

  信道:.NET Framework 包括两个默认的信道:HttpChannel(它使用 SOAP 格式化)和 TcpChannel(它使用二进制格式化)。开始时最好使用 HttpChannel 信道,因为在某些方案中可以通过防火墙使用该信道而不必打开端口,而且该信道支持标准的安全和身份验证协议。

  宿主应用程序域 :可以使用任何类型的应用程序域来生成侦听器应用程序,包括:Windows 窗体应用程序、ASP.NET Web 应用程序、控制台应用程序、Windows 服务或其他任何托管应用程序域。注意:由于远程配置是基于每个应用程序域进行的,因此应用程序域必须处于运行状态才能侦听请求。

配置:配置可以通过编程方式(或者使用应用程序或计算机配置文件)来进行。利用配置文件,您可以更改远程处理配置,而无须重新编译可执行文件等。

实现一个使用配置文件的简单宿主应用程序域需要:

    1. 创建远程类的配置文件。宿主应用程序必须能够找到用来加载远程类的配置的配置文件,因此,该配置文件应该与宿主应用程序保存在同一目录下,否则,将找不到该配置文件并引发异常。以下代码显示宿主应用程序域的 Listener.exe.config 配置文件。

public class CustomRemotableException : RemotingException, ISerializable {
    …
}

 

private string StringValue = "This is the RemotableType.";
public string StringMethod(){
    
return StringVale;
}

    3. 将该类另存为 Filename.cs,然后,在保存该文件的目录中,在命令提示符处键入以下命令:
      csc /noconfig /t:library RemotableType.cs,生成dll库文件。
   举例:

 // RemotableType.cs
using System;
public class RemotableType : MarshalByRefObject{
  
private string StringValue = "This is the RemotableType.";
  
public string StringMethod(){
    
return StringVale;
  }

}

  三、生成宿主应用程序
  

<configuration>
   
<system.runtime.remoting>
      
<application>
         
<service>
            
<wellknown 
               mode
="Singleton" 
               type
="RemotableType, RemotableType" 
               objectUri
="RemotableType.rem"
            
/>
         
</service>
         
<channels>
            
<channel ref="http" port="8989"/>
         
</channels>
      
</application>
   
</system.runtime.remoting>
</configuration>

    2.导入 System.Runtime.Remoting 命名空间。

using System;
using System.Runtime.Remoting;

    3.配置远程类的配置文件。

public class Listener{
   
public static void Main(){
      RemotingConfiguration.Configure(
"Listener.exe.config");
   }

}

    4.将该类另存为 Listener.cs并将该类编译成宿主可执行文件。记住需要将该文件保存在与RemotableType.dll 相同的目录中。编译需要键入以下命令:
  csc /noconfig /r:RemotableType.dll Listener.cs
  举例:

// Listener.cs
using System;
using System.Runtime.Remoting;

public class Listener{
   
public static void Main(){
      RemotingConfiguration.Configure(
"Listener.exe.config");
      Console.WriteLine(
"Listening for requests. Press Enter to exit...");
      Console.ReadLine();
   }

}

  四、生成客户端应用程序

  在之前我们已经定义了一个远程类型,并创建了一个宿主应用程序,最后要做的就是生成该远程类型的客户端,并且其要由宿主应用程序来承载;为此,应用程序必须将其自身注册为该远程对象的客户端,然后就像该对象位于客户端的应用程序域中一样调用它。.NET 远程处理系统将截获客户端调用,将其转发到远程对象,并将结果返回到客户端。以下代码过程介绍如何生成简单的远程处理客户端。

  生成简单的远程处理客户端需要:

    1. 导入 System.Runtime.Remoting 命名空间

    2. 创建一个客户端配置文件,以便客户端应用程序可以找到远程对象,并将该文件保存到客户端应用程序所在的那个文件夹中。
   例如,以下配置文件使远程处理系统知道可以在 RemotableType 程序集中找到 RemotableType 远程对象的类型信息,而且此客户端应该创建并使用位于 http://localhost:8989/RemotableType.rem 的 RemotableType 对象。

<configuration>
   
<system.runtime.remoting>
      
<application>
         
<client>
            
<wellknown 
               type
="RemotableType, RemotableType"
               url
="http://localhost:8989/RemotableType.rem"
            
/>
         
</client>
      
</application>
   
</system.runtime.remoting>
</configuration>
如果要在网络上运行该应用程序,必须用远程计算机的名称替换客户端配置中的“localhost”。

    3.客户端应用程序另存为 Client.cs并将该文件保存在与RemotableType.dll 副本相同的目录中。注意:客户端应用程序不应保存在 Listener.exe 应用程序所在的那个目录中。如果保存到同一目录,您将无法确定是否在接收和利用远程引用,因为当应用程序位于同一个目录时,可能会进行程序集和类型解析。

    4.编译客户端应用程序。例如,要编译客户端应用程序 Client.cs,需键入以下命令:
     csc /noconfig /r:RemotableType.dll Client.cs
  举例:

// Client.cs 
using System;
using System.Runtime.Remoting;

public class Client{

   
public static void Main(){
      RemotingConfiguration.Configure(
"Client.exe.config");
      RemotableType remoteObject 
= new RemotableType();
      Console.WriteLine(remoteObject.StringMethod());
   }

}

基本远程处理任务列表
  一、宿主任务
  1. 设计服务。 
    a.选择宿主应用程序域。
    b.选择激活模型。
    c.选择信道和端口。
    d.决定客户端获取服务的元数据的方式。

  2. 实现宿主应用程序域。远程处理宿主可以是 Windows 服务、控制台应用程序、Windows 窗体应用程序、Internet 信息服务 (IIS) 进程或 ASP.NET 应用程序。如果要以编程方式配置该系统,则无需使用配置文件。如果使用配置文件,则必须通过调用 RemotingConfiguration.Configure 将该文件加载到系统中。

  3. 在宿主中,创建适当的信道并通过调用 ChannelServices.RegisterChannel 将其注册到系统。如果使用配置文件,则必须通过调用 RemotingConfiguration.Configure 将该文件加载到系统中。

  4. 若没有已发布的类,则宿主无法运行,但使用服务的实现生成宿主环境的方法取决于共享服务的公共接口的方式。
 如果要实现 XML Web 服务(使用具有默认 SOAP 序列化的 HttpChannel),则客户端可以通过三种方式获取信息:
   • 使用 Soapsuds 工具 (Soapsuds.exe) 从终结点提取信息。
   • 下载包含元数据的程序集。
   • 下载接口的源代码。

  二、客户端任务
  1. 设计客户端。
    a.选择客户端应用程序域。
    b.确定激活模式以及客户端激活 URL 或远程类型的已知对象 URL。
    c.考虑是否需要注册信道和端口。
    d.获取远程类型的元数据。

  2. 实现客户端应用程序域。远程处理宿主可以是 Windows 服务、控制台应用程序、Windows 窗体应用程序、Internet 信息服务 (IIS) 进程或 ASP.NET 应用程序。

  3. 用激活模式和其他类型信息(如应用程序名和对象统一资源标识符 (URI))配置客户端远程处理系统。如果要以编程方式配置该系统,则无需使用配置文件。如果使用配置文件,则必须通过调用 RemotingConfiguration.Configure 将该文件加载到系统中。

  4. 创建适当的信道并通过调用 ChannelServices.RegisterChannel 将该信道注册到系统。如果使用配置文件,则必须通过调用 RemotingConfiguration.Configure 将该文件加载到系统中。