65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 远程处理

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (1投票)

2008年1月2日

CPOL

3分钟阅读

viewsIcon

24177

在 .NET 中,DCOM 组件的替代品是 .NET 远程处理

概述

DCOM 的替代品是 .NET 远程处理。.NET 远程处理可以描述为

  1. Web 服务无处不在
  2. CLR 对象远程处理

使用 SOAP 和 HTTP 只是调用 UDP、IPX 和 SMTP 等远程对象的一种方式。

CLR 对象远程处理位于 Web 服务之上的任何位置。

所有语言结构都可以与远程对象一起使用。

描述

.NET 远程处理用于访问另一个应用程序域中的对象。在远程程序集中,客户端接收到一个代理来与之通信。代理是客户端进程中远程对象的表示,用于调用方法。消息被传递到通道中的远程对象。

.NET 远程处理的架构

  • 远程对象:远程对象是在服务器上运行的对象
  • 通道:客户端和服务器之间的通信路径

用于通信的两种通道类型是 TCP 和 HTTP。

也可以使用不同的协议的自定义通道。

  • 消息:消息保存有关远程对象的信息,包括名称和所有参数。
  • 格式化程序:格式化程序定义如何将消息传输到通道中。默认是 SOAP 和二进制格式化程序。
  • 格式化程序提供程序:格式化程序提供程序将格式化程序与通道相关联,以将消息发送到线路。
  • 代理对象:代理对象有两种类型
    1. 透明
    2. 真实

透明代理对于客户端来说就像一个远程对象。透明代理调用真实代理上的 invoke () 方法。

  • 消息接收器:消息接收器是客户端和服务器上的拦截器。消息接收器与通道相关联。invoke () 方法使用消息接收器将消息传递到通道。真实代理(服务器上的代理)使用消息接收器将消息传递到通道,因此接收器可以在消息进入通道之前进行一些拦截。
  • 激活器:激活器由客户端使用来获取服务器(已创建)对象的代理。

Remoting

  • 配置:远程配置用于动态地或通过使用配置文件来配置服务器和客户端。
  • 通道服务:通道服务用于注册通道并将消息分派给它们。

客户端工作

当客户端调用远程对象时,会调用透明代理方法。然后,透明代理调用真实代理。真实代理负责将消息发送到通道。真实代理反过来定位消息接收器并将消息传递到接收器。消息接收器将消息发送到通道中。格式化程序格式化要在线路上传输的消息。通道负责连接到服务器上的侦听套接字并发送格式化数据。

服务器端工作

服务器通道接收格式化的消息,格式化程序取消整理消息。通道调用服务器上下文接收器(与服务器关联的消息接收器),然后调用对象上下文接收器(与对象关联的对象接收器)。最后一个对象上下文接收器调用远程对象中的方法。

什么是上下文

应用程序域可以具有不同的上下文。上下文用于将具有相似执行要求的对象分组在一起。

要将对象绑定到应用程序域,可以使用 MarshalByRefObject。而从 MarshalByRefObject 驱动的 ContextBoundObject 将对象绑定到上下文。在上下文之外,需要代理来访问该对象。

上下文属性被分配给从 ContextBoundObject 派生的对象。可以通过实现 IContextAttribute 来创建自定义属性。

分布式应用程序组件

  1. 远程对象
  2. 客户端
  3. 服务器

远程对象

应该从不同系统远程调用的对象必须从 System.MarshalByRefObject 派生。

Public class Hello:System.MarchalByRefObject
{
    Public Hello()
    {
    }
    ~Hello(){
    }

    Public string Greeting(string name)
    {
    }
}

使用一些端口创建 TCPServerChannel 以将其注册到通道服务。然后,使用 RegisterWellKnownServiceType 注册远程对象。

客户端

在客户端程序中,我们正在创建 TCPClientChannel 以获取用于通信的空闲端口。激活器用于返回远程对象的代理。

Public class HelloClient
{
    Main()
    {
        ChannelServices.RegisterChannel ( new TCPClientChannel() );
        Hello obj = (Hello) Activator.GetObject(type of(Hello),
            “tcp://localhost:8086/Hi”);
        If ( obj == null)
        {}
        for( int i=0; i < 5; i++) { obj.Greeting(“”);}
    } // end main
} // end HelloClient Class

历史

  • 2008 年 1 月 2 日:初始帖子
© . All rights reserved.