[Remoting] .NET Remoting

.NET Remoting  是一种分布处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,改善了很多功能,并与.Net平台很好的融合。.Net Remoting提供了一种允许对象跨应用程序域(即穿越边界)与别一对象进行交互框架。.NET Remoting 封装了分布式开发的消息编码和通讯方式,让我们用非常简单的方式既可完成不同模式的分布系统开发,同时其可配置、可扩展的特性也让我们拥有极大的灵活性。

信道
  Remoting是通过信道(channel)来实现两个应用程序域之间对象的通信的。

  信道(Channel)是 Remoting 体系的承载平台,负责处理客户端和服务器之间的通讯,其内容包括跨域通讯、消息传递、对象编码等等。信道必须实现 IChannel 接口,根据通讯方向又分别提供了继承版本 IChannelReceiver 和 IChannelSender。Remoting 框架为我们提供了 IPC、TCP 以及 HTTP 的实现版本,当然我们还可以在网络上找到其他协议的实现版本。
  Tcp通道提供基于Socket的传输工具,默认使用二进制序列化消息对象,因此具有很高的传输性能。
  Http提供使用http协议,能在Internet上穿越防火墙传输序列化消息流,默认使用Soap格式序列化消息对象,因此具有更好的互操作性。

远程对象
  在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。这种客户端通过通道来创建远程对象,称为对象的激活。

  在Remoting中,远程对象的激活分为两大类:服务器端激活和客户端激活。
  在分布系统中,远程对象需要跨越应用程序域进行传递,因此其表示方式会有所不同。基于性能和数据共享等原因考虑,Remoting 中远程对象可以是 "值封送对象(MBV)" 或 "引用封送对象(MBR)"。
  MBV 机制类似于 Web 无状态请求,服务器创建对象实例传递给信道发送到客户端,而后服务器端不再继续维护其状态和生存期。而 MBR 则在其生存期内一直存活在服务器程序域中,客户端只是通过代理对象来完成调用消息传递,客户端可以通过相关接口来延长远程对象的生存期。

激活模式
    服务器激活(Server-Activated Objects / SAO):只有在客户端调用代理对象第一个方法时才创建,区分为 Singleton 和 SingleCall 两种模式。Singleton 一如设计模式中的名称,无论有多少客户端都只有一个实例存在;而 SingleCall 则为每次调用创建一个新对象,因此它是无状态的。SingleCall 在方法调用完成后立即失效,不会参与生存期租约系统。
    客户端激活(Client-Activated Objects / CAO):在客户端调用 new 或 Activator.CreateInstance 时立即创建。

生存期租约
  Remoting 采取了一种称之为 "租约" 的机制来管理远程对象(Singleton、CAO)的生存期策略。每个应用程序域中都有一个租约管理器(LifetimeServices),它负责管理所有参与生存期的远程对象租约。租约管理器定期检查所有租约以确定过期的租约时间,如果租约已过期,将向该对象发起人(Sponsor)的发送请求,查询是否有谁要续订租约,若没有任何发起人续订该租约,租约将被移除,该远程对象也会被删除等待垃圾回收器回收。如果远程对象被发起人多次续订租约或被客户端持续调用,其生存期可以比其生存期租约长得多。
  所谓发起人就是一个或多个与远程对象关联,用于定义租约延长时间的对象。租约管理器通过回调发起人方法(ISponsor.Renewal)来查询是否续订租约。发起人需要继承自MarshalByRefObject,且必须实现 ISponsor 接口。在 System.Runtime.Remoting.Lifetime 名字空间中,Framework 为我们提供了一个缺省实现 —— ClientSponsor。
租约参数

    * 当参与生存期管理的远程对象被创建后,其租约被设置为 LifetimeServices.LeaseTime 或 ILease.InitialLeaseTime。
    * 我们可以通过 ILease.CurrentLeaseTime 来检查对象租约过期的剩余时间。
    * 客户端调用远程对象方法时,会发生隐式续订租约行为。当 CurrentLeaseTime 小于 RenewOnCallTime,则租约被设置为 RenewOnCallTime。
    * 租约管理器每隔一定时间(LeaseManagerPollTime)检查一次租约列表,如果某租约过期则通知其发起人,询问是否进行续订。如发起人未能在 SponsorshipTimeout 时间内响应,则移除该主办方并调用另一主办方。如果没有其他主办方,则租约过期,且垃圾回收器将处置该远程对象。

调用上下文
  调用上下文(CallContext)提供了用于存储属性集的数据槽,可以让我们在调用服务器方法时将一些额外数据一并传送过去。当然,这些额外数据有点限制,就是必须要实现 ILogicalThreadAffinative 接口。调用上下文在应用程序域边界被克隆,其数据槽不在其他逻辑线程上的调用上下文之间共享。

 

ABeen的测试代码:ABeen.Learn.rar

 

转载于:https://www.cnblogs.com/abeen/archive/2009/05/05/1450122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Standard 中使用 Remoting 需要使用 System.Runtime.Remoting 命名空间下的类。以下是使用 Remoting 的基本步骤: 1. 创建一个 Remoting 服务端应用程序,并在其中定义一个远程对象。使用 System.Runtime.Remoting.RemotingConfiguration.Configure() 方法来启用 Remoting 支持。 2. 在客户端应用程序中,使用 System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownClientType() 方法来注册远程对象的类型,并使用 Activator.GetObject() 方法来获取远程对象的实例。 3. 通过远程对象的代理,客户端可以调用远程对象的方法。 以下是一个简单的示例代码: 服务端应用程序: ```csharp using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; namespace RemotingServer { class Program { static void Main(string[] args) { TcpServerChannel channel = new TcpServerChannel(8080); ChannelServices.RegisterChannel(channel, false); RemotingConfiguration.RegisterWellKnownServiceType( typeof(MyService), "MyService", WellKnownObjectMode.Singleton); Console.WriteLine("Remoting server is running..."); Console.ReadLine(); } } public class MyService : MarshalByRefObject { public string SayHello(string name) { return $"Hello, {name}!"; } } } ``` 客户端应用程序: ```csharp using System; using System.Runtime.Remoting; namespace RemotingClient { class Program { static void Main(string[] args) { RemotingConfiguration.RegisterWellKnownClientType( typeof(MyService), "tcp://localhost:8080/MyService"); MyService service = (MyService)Activator.GetObject( typeof(MyService), "tcp://localhost:8080/MyService"); string result = service.SayHello("World"); Console.WriteLine(result); Console.ReadLine(); } } public class MyService : MarshalByRefObject { public string SayHello(string name) { return $"Hello, {name}!"; } } } ``` 在上面的示例中,服务端应用程序创建了一个名为 MyService 的远程对象,并将其注册为单例模式。客户端应用程序使用 RemotingConfiguration.RegisterWellKnownClientType() 方法注册远程对象类型,并使用 Activator.GetObject() 方法获取远程对象的实例。然后,客户端应用程序通过远程对象的代理调用 MyService.SayHello() 方法,该方法返回一个字符串,表示问候语。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值