没有合适的资源?快使用搜索试试~ 我知道了~
目录简介远程对象代理对象通道激活对象的租用生存期总结附录A:使用TCP通道进行远程处理的示例附录B:使用HTTP通道进行远程处理的示例简介Microsoft?.NETRemoting提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这种框架提供了多种服务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。格式化程序用于在消息通过通道传输之前,对其进行编码和解码。应用程序可以在注重性能的场合使用二进制编码,在需要与其他远程处理框架进行交互的场合使用XML编码。在从一个应用程序域向另一个应用程序域传输消息时,所有的XML编码都使用SOAP协议。出于安全性方面的考虑,远程处
资源推荐
资源详情
资源评论
Microsoft.NETRemoting:技术概述:技术概述
目录目录
简介简介
远程对象远程对象
代理对象代理对象
通道通道
激活激活
对象的租用生存期对象的租用生存期
总结总结
附录附录 A:使用:使用 TCP 通道进行远程处理的示例通道进行远程处理的示例
附录附录 B:使用:使用 HTTP 通道进行远程处理的示例通道进行远程处理的示例
简介简介
Microsoft? .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这种框架提供了多种服
务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。格式化程序用于在消息通过通道传输
之前,对其进行编码和解码。应用程序可以在注重性能的场合使用二进制编码,在需要与其他远程处理框架进行交互的
场合使用 XML 编码。在从一个应用程序域向另一个应用程序域传输消息时,所有的 XML 编码都使用 SOAP 协议。出
于安全性方面的考虑,远程处理提供了大量挂钩,使得在消息流通过通道进行传输之前,安全接收器能够访问消息和序
列化流。
通常,如果没有底层框架的支持,管理远程对象的生存期会非常麻烦。.NET Remoting 提供了许多可供选择的生存期模
型,这些模型分为两个类别:
客户端激活对象
服务器激活对象
客户端激活对象受基于租用的生存期管理器的控制,这种管理器确保了租用期满时对象可被回收。而对于服务器激活对
象,开发人员则可以选择“单一调用”模式或“单一元素”模式。
远程对象远程对象
任何远程处理框架的主要目的之一就是要提供必要的基础结构,以便隐藏远程对象调用方法和返回结果的复杂性。任何
位于调用方应用程序域之外的对象,即使在同一台计算机上执行,也会被认为是远程对象。在应用程序域内部,原始数
据类型按数值传递,而所有的对象按引用传递。因为本地对象引用仅在创建对象的应用程序域内有效,所以它们不能以
这种方式传递到远程方法调用或从远程方法调用返回。所有必须跨越应用程序域的本地对象都必须按数值来传递,并且
应该用 [serializable] 自定义属性作标记,否则它们必须实现 ISerializable 接口。对象作为参数传递时,框架将该对象序
列化并传输到目标应用程序域,对象将在该目标应用程序域中被重新构造。无法序列化的本地对象将不能传递到其他应
用程序域中,因而也不能远程处理。
通过从 MarshalByRefObject 导出对象,您可以使任一对象变为远程对象。当某个客户端激活一个远程对象时,它将接
收到该远程对象的代理。对该代理的所有操作都被适当地重新定向,使远程处理基础结构能够正确截取和转发调用。尽
管这种重新定向对性能有一些影响,但 JIT 编译器和执行引擎 (EE) 已经优化,可以在代理和远程对象驻留在同一个应用
程序域中时,防止不必要的性能损失。如果代理和远程对象不在同一个应用程序域中,则堆栈中的所有方法调用参数会
被转换为消息并被传输到远程应用程序域,这些消息将在该远程应用程序域中被转换为原来的堆栈帧,同时该方法调用
也会被调用。从方法调用中返回结果时也使用同一过程。
代理对象代理对象
代理对象是在客户端激活远程对象时创建的。作为远程对象的代表,代理对象确保对代理进行的所有调用都能够转发到
正确的远程对象实例。为了准确理解代理对象的工作方式,我们需要更深入地研究它们。当某个客户端激活一个远程对
象 时 , 框 架 将 创 建 TransparentProxy 类的一个本地实例(该类中包含所有类的列表与远程对象的接口方法)。因为
TransparentProxy 类在创建时用 CLR 注册,所以代理上的所有方法调用都被运行时截取。这时系统将检查调用,以确
定其是否为远程对象的有效调用,以及远程对象的实例是否与代理位于同一应用程序域中。如果对象在同一个应用程序
域中,则简单方法调用将被路由到实际对象;如果对象位于不同的应用程序域中,将通过调用堆栈中的调用参数的
Invoke 方法将其打包到 IMessage 对象并转发到 RealProxy 类中。此类(或其内部实现)负责向远程对象转发消息。
TransparentProxy 类和 RealProxy 类都是在远程对象被激活后在后台创建的,但只有 TransparentProxy 返回到客户
端。
要更好地理解这些代理对象,我们需要简要介绍一下 ObjRef。激活一节中有关于 ObjRef 的详细说明。以下方案简要说
明了 ObjRef 与这两个代理类的关联方式。但请注意,这只是关于该进程的一个极其概括的说明;根据对象是客户端激
活对象还是服务器激活对象,以及它们是单一元素对象还是单一调用对象,该进程会有所不同。
远程对象注册在远程计算机的应用程序域中。远程对象被封送以生成 ObjRef。ObjRef 包含了从网络上的任意位置定位
和访问远程对象所需的所有信息,包括:类的增强名称、类的层次结构(其父类)、类实现的所有接口的名称、对象
URI 和所有已注册的可用通道的详细信息。在接收到对某个远程对象的请求时,远程处理框架使用对象 URI 来检索为该
对象创建的 ObjRef 实例。
客户端通过调用 new 或某个 Activator 函数(例如 CreateInstance)来激活远程对象。对于服务器激活对象,远程对象
的 TransparentProxy 将在客户端应用程序域中生成并返回到客户端,这时不执行任何远程调用。只有在客户端调用远程
对象的某个方法时,该远程对象才会被激活。此方案明显不适合客户端激活对象,因为客户端希望框架只在得到请求时
才激活对象。当客户端调用某个激活方法时,客户端上会创建一个激活代理,并且将使用 URL 和对象 URI 作为终结点
在服务器的远程激活器上初始化一个远程调用。远程激活器激活该对象,然后 ObjRef 流向客户端,并被取消封送以生
成一个返回给客户端的 TransparentProxy。
取消封送的过程中会分析 ObjRef 以提取远程对象的方法信息,同时还会创建 TransparentProxy 和 RealProxy 对象。在
用 CLR 注册 TransparentProxy 之前,分析后的 ObjRef 内容会被添加到 TransparentProxy 的内部表中。
TransparentProxy 是一种无法替代和扩展的内部类,而 RealProxy 和 ObjRef 类则属于公共类,可以在必要时进行扩展
和 自 定 义 。 因 为 RealProxy 类能够处理远程对象的所有函数调用,所以它是执行负载平衡等操作的理想方法。调用
Invoke 时,从 RealProxy 导出的类可以获得网络中服务器的负载信息,并将该调用路由到适当的服务器。简单地为所需
的 ObjectURI 从通道请求一个 MessageSink,并调用 SyncProcessMessage 或 AsyncProcessMessage 以将该调用转
发至所需的远程对象。当调用返回时,通过调用 RemotingServices 类的 PropagateMessageToProxy 将返回参数推回到
堆栈中。
下面的代码片断显示了如何使用导出的 RealProxy 类。
MyRealProxy proxy = new MyRealProxy(typeof(Foo));
Foo obj = (Foo)proxy.GetTransparentProxy();
int result = obj.CallSomeMethod();
上例中获取的 TransparentProxy 可以被转发到另一个应用程序域中。当第二个客户端试图调用代理上的某个方法时,远
程处理框架会尝试创建 MyRealProxy 类的实例,并且如果程序集可用,所有的调用都会路由至此实例。如果程序集不可
用,调用会路由至默认的远程 RealProxy。
通过为默认的 ObjRef 属性 TypeInfo、EnvoyInfo 和 ChannelInfo 提供替代,可以很容易地自定义 ObjRef。下列代码显
示了如何进行自定义:
public class ObjRef {
public virtual IRemotingTypeInfo TypeInfo
{
get { return typeInfo;}
set { typeInfo = value;}
}
public virtual IEnvoyInfo EnvoyInfo
{
get { return envoyInfo;}
set { envoyInfo = value;}
}
public virtual IChannelInfo ChannelInfo
{
get { return channelInfo;}
set { channelInfo = value;}
}
}
通道通道
通道用于在远程对象之间传输消息。当客户端调用某个远程对象上的方法时,与该调用相关的参数以及其他详细信息会
通过通道传输到远程对象。调用的任何结果都会以同样的方式返回给客户端。客户端可以选择“服务器”中注册的任一通
道,以实现与远程对象之间的通讯,因此开发人员可以自由选择最适合需要的通道。当然,也可以自定义任何现有的通
道或创建使用其他通讯协议的新通道。通道选择遵循以下规则:
在能够调用远程对象之前,远程处理框架必须至少注册一个通道。通道注册必须在对象注册之前进行。
通道按应用程序域注册。一个进程中可以有多个应用程序域。当进程结束时,该进程注册的所有通道将被自动清除。
多次注册侦听同一端口的通道是非法的。即使通道按应用程序域注册,同一计算机上的不同应用程序域也不能注册侦听
同一端口的通道。
客户端可以使用任何已注册的通道与远程对象通讯。当客户端试图连接至某个远程对象时,远程处理框架会确保该对象
连接至正确的通道。客户端负责在尝试与远程对象通讯之前调用 ChannelService 类的 RegisterChannel。
所有的通道都由 IChannel 导出,并根据通道的用途实现 IChannelReceiver 或 IchannelSender。大多数通道既实现了接
收器接口,又实现了发送器接口,使它们可以在两个方向上通讯。当客户端调用代理上的某个方法时,远程处理框架会
截取该调用并将其转为要发送到 RealProxy 类(或一个实现 RealProxy 类的实例)的消息。RealProxy 将消息转发到消
息接收器以进行处理。消息接收器负责与远程对象注册的通道之间建立连接,并通过通道(在不同的应用程序域)将消
息从调度位置传输到远程对象本身。激活了一个远程对象后,客户端会通过调用选定通道上的 CreateMessageSink 来选
择通道,并从其上检索能够与远程对象通讯的消息接收器。
远程处理框架的一个容易混淆的方面是远程对象和通道之间的关系。例如,如果 SingleCall 远程对象只在被调用时才激
活,那么该对象如何侦听要连接的客户端?
部分答案在于这样一个事实:远程对象并不拥有自己的通道,而是共享通道。作为远程对象宿主的服务器应用程序必须
注册要通过远程处理框架公开的对象以及所需的通道。注册后的通道会自动开始在指定的端口侦听客户请求。注册远程
对象后,会为该对象创建一个 ObjRef 并将其存储在表中。当通道上传来一个请求时,远程处理框架会检查该消息以确
定目标对象,同时检查对象引用表以定位表中的引用。如果找到了对象引用,将从表中检索框架目标对象或在必要时将
其激活,然后框架将调用转发至该对象。对于同步调用,在消息调用期间会一直维持来自客户端的连接。因为每个客户
端连接都在自己的线程上处理,所以一个通道可以同时服务于多个客户端。
生成商务应用时,安全性是一个重要问题。要满足商务要求,开发人员必须能给远程方法调用添加诸如授权或加密等安
全特性。为了实现这一目标,开发人员可以自定义通道,使其能够对与远程对象之间的实际消息传输机制进行控制。在
传输到远程应用程序之前,所有的消息都必须流过 SecuritySink、TransportSink 和 FormatterSink,且这些消息传递到
远程应用程序后会以相反次序流过同样的接收器。
HTTP 通道
HTTP 通道使用 SOAP 协议与远程对象传输消息。所有的消息流过 SOAP 格式化程序时都被转换为 XML 格式且被序列
化,所需的 SOAP 头也会被添加到该流中。您也可以指定能够生成二进制数据流的二进制格式化程序。然后,数据流会
剩余16页未读,继续阅读
资源评论
weixin_38738506
- 粉丝: 2
- 资源: 895
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功