.NET Remoting 技术解析

.NET Remoting 是一种允许应用程序访问另一个应用程序域中对象的技术。它提供了一种机制,使得开发者可以像调用本地对象一样调用远程对象。这种技术建立在Web服务之上,支持多种语言构造的使用。

.NET Remoting的架构

.NET Remoting 的架构包括以下几个关键组件:

远程对象(Remote Object):运行在服务器上的一个对象。

通道(Channel):客户端和服务器之间的通信路径。

消息(Message):包含关于远程对象的信息,包括名称和所有参数。

格式化程序(Formatter):定义如何将消息传输到通道。默认是SOAP和二进制格式化程序。

格式化程序提供者(Formatter Provider):将格式化程序与通道关联,以便发送消息。

代理对象(Proxy Object):有两种类型的代理对象:

透明代理(Transparent Proxy):对客户端来说就像远程对象一样。透明代理调用Real Proxy的invoke()方法。

真实代理(Real Proxy):负责将消息发送到通道。

消息接收器(Message Sink):客户端和服务器上的拦截器。消息接收器与通道关联。invoke()方法使用消息接收器将消息传递到通道。

激活器(Activator):客户端使用激活器来获取服务器上已创建对象的代理。

远程配置(Remoting Configuration):用于配置服务器和客户端,可以动态配置或使用配置文件。

通道服务(Channel Services):用于注册通道并将消息分派给它们。

客户端工作流程

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

服务器端工作流程

服务器通道接收格式化后的消息,格式化程序将消息反序列化。通道调用服务器上下文接收器(与服务器关联的消息接收器),它们反过来调用对象上下文接收器(与对象关联的对象接收器)。最后一个对象上下文接收器调用远程对象中的方法。

上下文(Context)

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

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

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

分布式应用程序组件

远程对象、客户端和服务器是分布式应用程序的组成部分。

远程对象:需要从不同系统远程调用的对象必须派生自System.MarshalByRefObject。

public class Hello : System.MarshalByRefObject { public Hello() { } ~Hello() { } public string Greeting(string name) { // 实现问候逻辑 } }

TCP服务器通道创建时会注册一个端口以供通道服务使用。然后使用RegisterWellKnownServiceType将远程对象注册。

客户端示例

public class HelloClient { public static void Main() { ChannelServices.RegisterChannel(new TCPClientChannel()); Hello obj = (Hello)Activator.GetObject(typeof(Hello), "tcp://localhost:8086/Hi"); if (obj == null) { // 处理对象为空的情况 } else { for (int i = 0; i < 5; i++) { Console.WriteLine(obj.Greeting("")); } } } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485