
.NET Remoting 是一种跨应用程序域或跨网络的通信框架,它可以让客户端应用程序访问和调用服务器端应用程序中的对象。.NET Remoting 是基于 .NET Framework 的 System.Runtime.Remoting 命名空间及其子命名空间提供的类和接口实现的。在学习 .NET Remoting 之前,我们需要了解一些基本的概念和组件,如下所述:
远程对象:远程对象是指运行在服务器端应用程序域中的对象,它们可以被客户端应用程序通过代理对象访问和调用。远程对象必须从 MarshalByRefObject 类派生,这样它们才能跨应用程序域边界传递引用。远程对象可以是单例的,也可以是每次请求都创建一个新实例的。
信道:信道是指客户端和服务器之间传输消息的媒介,它们负责将消息序列化和反序列化,并将其发送到目标地址。.NET Remoting 支持多种类型的信道,如 HTTP 信道、TCP 信道、IPC 信道等,它们分别使用不同的协议和格式来传输消息。信道可以通过配置文件或代码来注册和配置。
消息:消息是指客户端和服务器之间交换的数据单元,它们包含了远程对象的标识、要调用的方法名、传递的参数等信息。消息可以是同步的,也可以是异步的。消息可以使用 SOAP 格式或二进制格式来表示。
格式化器:格式化器是指负责将消息转换为特定格式的组件,它们与信道配合使用,以便于消息在跨网络上进行传输。.NET Remoting 支持两种类型的格式化器,分别是 SOAP 格式化器和二进制格式化器。SOAP 格式化器使用 XML 来表示消息,它具有可读性和跨平台性的优点,但也有性能和大小的缺点。二进制格式化器使用二进制数据来表示消息,它具有性能和大小的优点,但也有可读性和跨平台性的缺点。
代理对象:代理对象是指客户端应用程序中代表远程对象的对象,它们负责将客户端对远程对象的方法调用转换为消息,并通过信道发送给服务器端。代理对象分为透明代理和真实代理两种。透明代理是由 CLR 自动生成的,它实现了远程对象所实现的接口,并重写了所有方法,使得客户端可以像调用本地对象一样调用远程对象。真实代理是由开发者自定义的,它继承自 RealProxy 类,并重写了 Invoke 方法,使得客户端可以对远程对象进行更灵活的控制。
接收器:接收器是指在客户端或服务器端拦截消息并对其进行处理的组件,它们可以实现一些额外的功能,如安全、日志、缓存等。接收器分为客户端接收器和服务器端接收器两种。客户端接收器又分为特使接收器(envoy sink)和服务环境接收器(context sink),它们分别位于透明代理和真实代理之间、真实代理和信道之间。服务器端接收器又分为服务环境接收器(context sink)和对象
接收器:接收器是指在客户端或服务器端拦截消息并对其进行处理的组件,它们可以实现一些额外的功能,如安全、日志、缓存等。接收器分为客户端接收器和服务器端接收器两种。客户端接收器又分为特使接收器(envoy sink)和服务环境接收器(context sink),它们分别位于透明代理和真实代理之间、真实代理和信道之间。服务器端接收器又分为服务环境接收器(context sink)和对象环境接收器(object sink),它们分别位于信道和远程对象之间、远程对象和方法调用之间。
激活器:激活器是指负责在服务器端创建或获取远程对象的组件,它们可以实现不同的激活策略,如单例模式、工厂模式等。激活器分为客户端激活器和服务器端激活器两种。客户端激活器是由客户端应用程序使用 Activator 类或 RemotingConfiguration 类来创建或获取远程对象的代理对象。服务器端激活器是由服务器端应用程序使用 RemotingConfiguration 类或配置文件来注册或发布远程对象。
.NET Remoting的使用方法:
在服务器端和客户端引入必要的命名空间,如System.Runtime.Remoting和System.Runtime.Remoting.Channels等。
在服务器端创建远程对象类,继承自System.MarshalByRefObject,并定义公共的方法和属性。
在服务器端创建信道对象,指定监听的端口和传输协议(TCP或HTTP),并注册到ChannelServices类中。
在服务器端使用RemotingConfiguration类的RegisterWellKnownServiceType方法注册远程对象,指定对象的类型、URI和激活模式(单次调用或单例)。
在客户端创建信道对象,指定连接的端口和传输协议(TCP或HTTP),并注册到ChannelServices类中。
在客户端使用Activator类的GetObject方法获取远程对象的代理,指定对象的类型和URI。
在客户端通过代理对象调用远程对象的方法和属性。
//服务器端代码
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
//定义远程对象类,继承自MarshalByRefObject
public class RemoteObject : MarshalByRefObject { public RemoteObject() { }
public string SayHello()
{
return "Hello, this is a remote object.";
}
}
//定义服务器端应用程序类
class ServerApp { static void Main(string[] args) { //创建一个TCP信道,监听8085端口 TcpChannel channel = new TcpChannel(8085); //注册信道到ChannelServices类中 ChannelServices.RegisterChannel(channel); //注册远程对象,指定类型、URI和激活模式(单例) RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), “RemoteHello”, WellKnownObjectMode.Singleton); //在控制台输出信息,等待客户端连接 Console.WriteLine(“Server is running. Press ENTER to exit.”); Console.ReadLine(); } }
//客户端代码
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
//定义客户端应用程序类
class ClientApp { static void Main(string[] args) {
//创建一个TCP信道,连接到服务器的8085端口
TcpChannel channel = new TcpChannel(0);
//注册信道到ChannelServices类中
ChannelServices.RegisterChannel(channel);
//获取远程对象的代理,指定类型和URI
RemoteObject remoteObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject), “tcp://localhost:8085/RemoteHello”);
//通过代理对象调用远程对象的方法,并输出返回值
Console.WriteLine(remoteObject.SayHello()); } }
总结这是关于 .NET Remoting 跨应用程序域或跨网络的通信框架的基本概念和组件的介绍,可以通过这些知识来理解 .NET Remoting 的工作原理和使用方法。