.NET Remoting 是一种允许应用程序访问另一个应用程序域中对象的技术。它提供了一种机制,使得开发者可以像调用本地对象一样调用远程对象。这种技术建立在Web服务之上,支持多种语言构造的使用。
.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):用于注册通道并将消息分派给它们。
当客户端调用远程对象时,透明代理方法被调用。透明代理然后调用真实代理。真实代理负责将消息发送到通道。真实代理反过来定位消息接收器并将消息传递给接收器。消息接收器将消息发送到通道。格式化程序将消息格式化以便在线上发送。通道负责连接到服务器上的监听套接字并发送格式化后的数据。
服务器通道接收格式化后的消息,格式化程序将消息反序列化。通道调用服务器上下文接收器(与服务器关联的消息接收器),它们反过来调用对象上下文接收器(与对象关联的对象接收器)。最后一个对象上下文接收器调用远程对象中的方法。
应用程序域可以有不同的上下文。上下文用于将具有相似执行要求的对象分组。
要将对象绑定到应用程序域,可以使用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(""));
}
}
}
}