国内最大的酷站演示中心! 可靠的 xml web service eric schmidt microsoft corporation,xml core services 组,项目经理 2001 年 12 月 11 日
下载此专栏的示例代码。
注意:要下载与本文相关的代码,您需要: visual studio .net release candidate(英文) sql server 2000(英文) 在 pdc 上,我谈论了有关可靠的 xml web service(web 服务)的话题,这个话题源于过去一年来的多次交流。在有关建立 xml web service 的众多常见问题中,可靠性问题是开发人员实现分散式 web 服务所面临的五个最重要的问题之一。如果分开来讲,这个问题并不是太难,因此,本月我准备谈一谈建立可靠的 xml web service 这一棘手的问题。
概述 global xml web services architecture(gxa [英文])最突出的一面就是可以使用可合成处理协议扩展该体系结构。这些协议主要通过 soap 标头实现,可以提供包括安全性、加密、路由和可靠性的广泛服务。当您开始构建基于 gxa 的应用程序时,您将发现 gxa 实质上是一种消息处理体系结构,它通过基于标准的编码技术 (soap) 在系统和服务之间提供协同工作能力。到目前为止,大部分实现工作都集中在 soap 1.1 和 wsdl 兼容服务上,因此 web 服务实现方案可以与多种语言和操作系统协同工作。
这是一个了不起的概念。任何两个系统之间都能够进行交流,只要它们能够分析 xml 并理解 soap 规范的规则。但是,简单的消息交换并不能满足复杂的业务应用程序的需要。真正的应用程序(不管其内部域体系结构如何)均需要标准化的服务,例如处于 web 服务消息处理层上的安全性、授权和可靠性。在 global xml web services architecture(具体地说就是 soap、soap 模块和基础结构协议)的创建和实现背后有一个巨大的动力。随着今年十月份四项新规范(ws-routing、ws-referral、ws-licensing 和 ws-security)的发布,我们已经开始着手下一代 xml web service 实现工作。尽管发布了这么多的新规范,但仍有两个领域尚无公共规范,即事务处理和可靠的消息处理,这主要是因为这些基础结构协议依赖于底层 soap 模块。
本专栏主要从 gxa 环境的角度讨论可靠性和可靠的消息处理的含义。而且我还要花一些时间探讨通过在 .net 框架中扩展现有 web 服务类来开发可靠性协议需要做些什么。本专栏有两个主要目的:
让读者了解可靠性概念,为以后各种规范的实施做好准备。请注意,本文不是规范,而只是一篇文章,旨在引发读者思考下面要讨论的问题。 说明 .net 框架中 web 服务和 soap 类强大的、基于标准的功能。 xml web service 的可靠性 我们把问题分开来讲。我们前面讲过,gxa 服务实现方案属于消息处理服务,它们需要在分散式环境中发送和接收基于标准的编码消息。在 web 服务实现方案中发送 soap 消息的主要传输协议是 http,它易于实现和管理,但本身不可靠。我们无需深入探讨 http 不可靠的具体原因,但只要知道 http 没有基于标准的服务来保证终点或服务器能够接收到请求就足够了。尽管内置的网络层设备可以在发生一般灾难性故障(例如未找到资源)时产生错误,但是却没有机制可以确保客户端能够以可靠的方式接收请求或响应。
建立可靠性层 明确了上述要求之后,我们来讨论如何使用 .net 框架为 web 服务实现方案建立可靠性协议。根据上述要求,我建立了一个小型 api,以便提供可用的实现方案。
协议:ericrp 第一个问题是定义如何分解可靠性协议 (ericrp)。以下是该协议的关键之处:
该协议是用于教学的原型。 该协议主要是通过扩展 soap 消息处理层在 soap 处理层上执行的。 soap 标头用于对处理层所需信息进行编码。 该协议要求实现方案具有某种方式的持续存储,以便记录消息。本实现方案使用的是 microsoft sql server 2000。 注意:不管采取哪种方式在 soap 环境中实现可靠性层,除了 soap 分析器之外,都还需要其他基础结构。 该协议支持对话概念,也就是说可以对多条消息进行排序,从而保证有序的发送。 该协议的全部实现方案都由 ericrp 名称空间限定。 ericrp 基于两方对话方案,即两个服务可以通过 xml web services 体系结构(http、soap 和 wsdl)进行对话。 客户端负责消息的所有更正。(本文后面有详细论述) 服务器只负责基于特定标准发送确认。 服务器不记录收到的过期消息。 服务器不记录收到的无序消息。 服务器不记录收到的重复消息。 处理 api 在这个原型中,我建立了六个主要的类和一个小型数据库。我将类称为处理 api。web 服务客户端和服务器将使用这些类监控和更正使用 ericrp 可靠性协议的消息。所有的类都属于 ericrp 名称空间:
client.conversationmanager:由客户端使用,创建 web 服务消息关联和消息监控的对话环境。 client.rpclienttrace:由 web 服务客户端使用,这些客户端的方法对出站消息执行 ericrp 可靠性协议。 server.conversationmanager:由 web 服务服务器使用,记录并处理入站消息。 server.rpservertrace:由 web 服务服务器使用,这些服务器的方法对入站消息执行 ericrp 可靠性协议。 reliabilityinfo:具有双重作用。它可以由 client.conversationmanager 使用,为记录提供可靠性信息;也可以由 web 服务客户端代理使用,为出站消息创建必要的 soap 标头信息。 acknowledgment:由 server.conversationmanager 使用,向客户端发送确认。 ericrp 的工作原理 在查看代码之前,我想先从用户的角度说明该协议的工作原理。例如,我有一个简单的 web 服务代理类,通过它可以向 web 服务发送订单消息。打算使用 api 的客户端需要执行以下操作:
首先,创建 client.conversationmanager 类的实例并开始一个新对话。例如:
private void begin() { rpclient = new ericrp.client.conversationmanager();
rpclient.messagesent += _ new ericrp.client.conversationmanager.messagesenteventhandler(process);
rpclient.conversationstarted += new _ ericrp.client.conversationmanager.conversationstartedhandler(constarted);