.Net远程方法调用研究2010-12-21drizt简介远程方法调用发展到现在,已经有以下几种框架实现:DCE/RPC,CORBA, DCOM,MTS/COM+,Java RMI,Java EJB,Web Services/SOAP/XML-RPC,NET Remoting,本文主要介绍了.NET远程方法调用的原理,实现以及与微软COM/DCOM 实现的异同点。框架Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象 进行交互的框架。众所周知,Web服务仅仅提供了一种简单的容易理解的方法来 实现跨平台,跨语言的交互,而DotNet Remoting相对于Web服务就像Asp相对于 CGI那样,实现了一种质的转变。DotNet Remoting提供了一个可扩展的框架,它 可以选择不同的传输机制(HTTP和TCP是内置的),不同的编码方式(SOAP以及 二进制代码),安全设置(IIS或SSL),同时提供了多种服务,包括激活和生存 期支持。远程方法调用对于远程方法调用来说,最直接的问题恐怕是:一个本地方法,推而广之, 一个本地对象,如果放在网络环境中,如何传递这个方法的调用,返回,如何传 递这个对象的请求。虽然对于应用开发人员来说这个并不是必不可少的事,但对 于我们学习分布式操作系统来说,我想这是应该搞清楚的。我们知道,DCOM协议 也被称为对象RPC,它建立在DCE RPC协议基础上,也就是说,在网络传输这一层 ,它必须使用特殊的协议。另外Windows RPC 机制要求熟悉的类型和使用 IDL 工具的封送处理知识,并向开发人员公开 RPC 客户端和服务器存根的管理。 Remoting 在为 .NET 提供 RPC 时要容易得多,而且由于使用简单易懂的 .NET 数据类型,从而消除了早期 RPC 机制中存在的类型不匹配的情况(这是一个非 常大的威胁)。配置为使用 HTTP 或 TCP 协议,并使用 XML 编码的 SOAP 或本 机二进制消息格式进行通信。开发人员可以构建自定义的协议(通道)或消息格 式(格式化程序),并在需要时由 Remoting 框架使用。服务器和客户端组件都 可以选择端口,就象可以选择通信协议一样。由此带来的一个好处是,很容易建 立并运行基本的通信。下面描述了.Net Remoting的五要素:代理:在Client端伪装为Remote Objects并转发对Remote Objects的调用。Message:消息对象包含了执行Remote Methods调用的必要数据参数。Message Sink/Channel Sink:在Remote调用中,Message Sink允许定制消息 处理流程,这是.Net Remoting内置的可扩展特性。Formatter:也是Message Sink,用来序列化消息,已适于网络传输,如SOAP 。Transport Channel:也是Message Sink,用来传输序列化的消息到远程进程 ,如HTTP。当访问Remote Objects时,Client端application并不处理真实对象的引用, 而是仅仅调用Proxy对象的方法。Proxy对象提供与Remote Objects相同的接口, 伪装成Remote Objects。Proxy对象自己并不执行任何方法,而是以消息对象 (Message Object)的形式转发每一个方法调用给.Net Remoting Framework。在类型支持方面,DCOM提供了一套复杂的列集和散集机制,他建立在RPC的基 础上。由于RPC被定义为DCE标准的一部分,而DCE RPC定义了所有常用的数据类 型的数据表达方法,即网络数据表示法。为了使存根(stub)代码和代理对象能 够正确地对参数和返回结果也进行列集和散集,它们应该使用一致的数据表示法 NDR,以便在不同的操作系统环境下也能够远程调用。This figure is from the book named Advanced .Net Remoting.反过来,我们再看看.NET Remoting 强大的类型操作,.Net Remoting 支持 所有托管的类型、类、接口、枚举、对象等,这通常被称为“多类型保真”。这 里的关键在于,如果客户端和服务器组件都是在应用程序域中运行的 CLR 托管 的对象,则数据类型的互操作是不成问题的。从根本上讲,我们拥有的是一个封 闭的系统,会话的两端可以完全被理解,因此我们可以充分利用这一事实,处理 好用于通信的数据类型和对象。在各种系统并存的情况下,我们需要考虑系统之间的互操作性。对于可互操 作的数据类型,我们要谨慎处理。例如,Web 服务数据类型的定义要基于 XML 架构定义 (XSD) 关于数据类型的说明。任何可以使用 XSD 进行描述并可以在 SOAP 上进行互操作的类型都可以使用。但是,这也确实使得某些数据类型不能 使用。