.NET Remoting 一种跨应用程序域或跨网络的通信框架

.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 的工作原理和使用方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

polsnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值