Remoting 和 ASP.NET Web 服务
Remoting 和 ASP.NET Web
服务
Remoting 就属于这种情况,有时很难决定针对不同的目的应该选用哪种技术。当然,正确的答案是为要解决的问题选择最佳的技术。
不要使用“始终使用 Web 服务”或“Web 服务是 Remoting 的子集,因此它就等于所有的
Remoting”等指令性的评述。本节将主要介绍这两种技术,说明在特定的情况下,为什么是选择这一种更有意义而不是另一种。
ASP.NET Web 服务和 .NET Remoting
让我们从 Web 服务的定义开始,定义说 Web
服务就是可以在 Web 上提供的服务。这个定义并不是很有用,我们不妨进一步把它提炼成“通过 SOAP 和 HTTP
访问的、可寻址的处理单元,这个处理单元是用 WSDL 描述的,可以通过 UDDI 发布。”这个定义就有用多了,因为它把 Web 服务和将 HTML
发送回浏览器的 Web 服务器
上提供的程序化的服务不同。例如,根据我们的定义,可以使用 WSDL 从客户端通过 HTTP 访问的
互操作性
理论是:如果需要在不同系统之间进行互操作,应该选择使用开放标准 (SOAP、XML、HTTP) 的 Web 服务方法,而使用 .NET Remoting
决不是一种交互的解决方案;如果各种系统中的所有组件都是 CLR 托管的,则 .NET
Remoting“可能”是正确的选择。这一原则的适用范围很广,但有所区分还是非常有用的。.NET 远程对象的客户端应该是 .NET 客户端。如果您的
服务将是正确的选择。当然,
强大的类型支持
.Net Remoting
支持所有托管的类型、类、接口、枚举、对象等,这通常被称为“多类型保真”。这里的关键在于,如果客户端和服务器组件都是在应用程序域中运行的 CLR
托管的对象,则数据类型的互操作是不成问题的。从根本上讲,我们拥有的是一个封闭的系统,会话的两端可以完全被理解,因此我们可以充分利用这一事实,处理好用于通信的数据类型和对象。
在各种系统并存的情况下,我们需要考虑系统之间的互操作性。对于可互操作的数据类型,我们要谨慎处理。例如,Web 服务数据类型的定义要基于 XML
架构定义 (XSD) 关于数据类型的说明。任何可以使用 XSD 进行描述并可以在 SOAP
上进行互操作的类型都可以使用。但是,这也确实使得某些数据类型不能使用。例如,对于无符号的字符类型或枚举,不存在相应的 W3C XSD 表示法。对于不同的 Web
服务实现,集合的处理不同,异常和数据集的处理也不同。另一个问题是,私有字段和属性不在 Web
服务调用之间传递,这对字段和属性本身来说并不是关键问题,但如果您的系统要求在不同的技术之间进行互操作,则在设计和测试系统时,这却是一个要考虑的因素,因为可以发送内容并不意味着可以接收到它。
再重复一遍,如果需要在不同的系统之间进行互操作,就不应该考虑使用 .NET Remoting 技术。如果是封闭的、CLR
托管的解决方案,则可以使用它。
状态管理
我们已经看到很多方法,使用基于激活方式(客户端激活或 Singleton)的 .Net Remoting
实现状态管理。对 .NET Remoting 和 Web 服务来说,通过 HTTP(带有不确定超时的无状态协议)来管理每个客户端的连接状态是件烦琐且不切实际的事情。但是,如果您需要维护状态,那么 Remoting
提供了一种基于每个对象的解决方案。Web 服务没有提供这种每个客户端的连接状态管理,但提供了对 ASP.NET 会话和应用程序对象的访问。
生存期管理
与状态管理有关的是生存期管理。正如我们所看到的,Remoting
为管理远程对象的生存期提供了功能强大的机制。Web 服务对象随 Web 服务的调用而存在和消失(从概念上讲,对同步和异步都是这样)。在这方面,Web 服务与
Remoting 相比,是一种单一调用类型。Remoting 对远程对象的激活和终止提供了更大程度上的控制。这对于您的设计可能有意义,也可能没意义。
按值调用和按引用调用
传递到 Web 服务调用的对象是经过序列化的,并按值进行传递。传递到 Remoting
的对象或被调用的对象本身可以按值或按引用进行传递。序列化的远程对象方法是在客户端进行处理的。在 Remoting 和 Web
服务之间进行选择时应该考虑这些不同。当然,这些考虑对您来说是否重要,也取决于要解决的问题的性质。
支持的协议
Web 服务调用仅限于 HTTP 上的 SOAP 编码的 XML。Remoting 可以使用 TCP
传输,或者扩展基础结构以支持自定义的协议。例如,在 www.gotdotnet.com 上的 jhawk 用户示例部分提供了一个使用 Named Pipe 的
Remoting 实现。
这里是 NamedPipe 自述文件的一个片段,阐明了 Remoting 的可扩展性:
通过实现 IChannel* 接口,可以使用可插入式通道结构将通道插入到 .NET Remoting 中。
Named Pipe
通道支持以下功能:
* 通过命名管道进行通信
* 同步消息
* 异步消息
* 单程消息
*
回调
* 通道接收
* 通道属性
* 自动生成管道名称
因此,如果您需要 Named Pipe,Remoting
可以提供解决方案。但是,与 SSPI NTLM 身份验证解决方案一样,Microsoft 目前也不支持这种解决方案,也许将来 Microsoft
会满足这种需要。