重新考虑“代码优先”的Web服务

你开始开发SOAP Web服务了吗?如果是的话,那么你有两种开发风格可选择。第一种被称为“由WSDL开始(start-from-WSDL)”,或是“契约优先(contract first)”,牵涉构建一个WSDL服务描述,并直接关联用于数据交换的XML模式。第二种被称为“由代码开始(start-from-code)”,或是“代码优先(code first)”,牵涉将例子服务代码插入你选择的框架,并由那个代码产生WSDL+模式(schema)。

不论使用哪种开发风格,最终目标都是相同的——你想要你的服务有一个稳定的WSDL+模式定义。当你正工作在一个SOA环境时,这个目标尤其重要。SOA要求服务松耦合,服务间的接口是固定的,且与实现相分离。XML Web服务为实现SOA创建了一个重要的基础,这很大程度上是因为WSDL和模式可以让你以平台中立的方式去指定被一个Web服务使用的XML消息交换。如果WSDL和模式不是稳定的,服务就只能被由服务提供者直接或间接控制的客户端使用——这可不是SOA。

“由代码开始”的问题

“由代码开始”开发Web服务的想法被许多Web服务和SOA领域的权威人士反对。他们觉得“由代码开始”将XML消息结构绑定到了一个特定的实现,这废弃了使用WSDL和模式的整个目的。对于“由代码开始”的最初形式——SOAP编码模式(SOAP encoding scheme)——的确是这样,它被广泛使用以支持rpc/encoded。使用SOAP编码,XML模式直接由服务提供者应用数据结构产生,客户端代码使用这些产生的数据结构副本进行工作。这种数据模型和XML之间自动转换的特性使得rpc/encoded在早期的SOAP中流行——但是它也是这种风格后来被废止的一个重要原因。它意味着,每次你的服务数据结构的改变都会引起模式的改变,客户端将需要使用新的模式重新生成它们的代码。


图1.“由代码开始”的SOAP编码方式

使用SOAP编码除了产生紧耦合,在XML数据表示和模式定义方面它也有一些缺点。SOAP编码是用于对象图的XML序列化算法,以编程语言独立的方式定义。既然它是一个序列化算法,因此就最后产生的XML结构来说没有灵活性——你应用这个算法到你的数据结构上,你所得到的就是用于那些结构的SOAP编码。不幸的是,所使用的序列化规则导致了XML模式对于其他非rpc/encoded消息交换几乎没有任何用处(包括文档校验)。序列化格式同样还导致较差的效率,这是因为引用结构的花销、过多的运行时打印,以及为所有组件使用子元素(而不是在合适的地方使用属性)。

大多数这些问题适用于那些只是在数据结构和XML间序列化的技术。但是“由代码开始”并不意味着必须通过直接序列化来暴露数据模型。使用某种形式的数据绑定,当前的Web服务栈通常都支持数据模型和XML间的灵活转换。使用数据绑定,你可保持对数据的XML表示的控制。那种控制意味着你的模式定义至少可以与实际的数据模型间稍有隔离,并且你可以选择适合你数据的XML表示。使用数据绑定方法,大多数与SOAP编码有关的问题就不再会有了。

“由WSDL开始”的问题

与使用代码工作相比,使用“由WSDL开始”的最大问题就是使用WSDL和模式定义工作的麻烦本性。现代IDE一般都配备了“智能”编辑器和令代码变更容易的强大的重构工具。目前还没有用于WSDL和模式的等价工具。即便是最基础的模式重构,如转换局部定义到全局定义,也不被主流WSDL和模式工具所支持。

因为工具软弱,“由WSDL开始”还需要扎实理解WSDL和模式,这样才能获得良好的效果。如果可供开发者使用的工具没有立足于标准之上,那么最终的WSDL和模式常常是丑陋的大杂烩,它使得服务和数据的结构更加模糊,而不是更清晰。就WSDL部分而言,要有效地理解它还不太困难,但是模式这一部分就不同了。W3C XML模式推荐(“模式”的全称)至少与大多数编程语言一样复杂,要精通它需要花很多工夫。拥有专门架构团队的大型组织可以负担得起雇用或培训模式专家,但是对于更小的组织而言,模式的复杂性是“由WSDL开始”的服务规格的真正障碍。

即使在开发出WSDL和模式定义的初始集合之后,这些“使用的方便性”问题仍然适用。服务综合集合的开发总是一个迭代过程,反复经过规格、原型和测试周期。在每一阶段,功能蹩脚工具所带来的工作不便都会是开发的障碍。

使“由代码开始”起作用

目前,针对“由代码开始”完成服务规格的可用工具已经远远超越令这种开发类型声名狼藉的SOAP编码模型。它们提供了灵活性和可扩展性,使得它能与相当复杂的数据结构一起工作。最重要的是,它们在代码定义的数据结构与相应的XML表示之间增加了一个解耦层。

微软的.NET框架和Sun的JAX-WS 2.0/JAXB 2.0是两个流行的例子。两者都使用内嵌于源代码中的配置信息(在.Net中是属性,在JAX-WS/JAXB中是标注)来控制数据结构与XML间的相互转换。由这种内嵌配置提供的控制是有限的,而且通常等于只需详列出不同于缺省序列化选择的差异。那意味着XML并不必需与数据结构的细节相隔离——例如,如果你给对象增加一个域,它将自动成为XML表示的一部分,除非你显式列出要包含的域——但是它要比一个纯粹的序列化方式要好得多。


图 2.“由代码开始”的.NET和JAX-WS 2.0/JAXB 2.0方式

时间: 2016-04-11

重新考虑“代码优先”的Web服务的相关文章

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器

ASP.NET中利用SQLXML WEB服务访问XML数据

asp.net|sql|web|web服务|xml|访问|数据      引言 使用SQLXML 的Web 服务从你的ASP.net应用程序中直接访问XML 数据       SQLXML 是扩展SQL 服务器现有的对检索和储存XML 数据的支持的一套附加的工具. 有了SQLXML 3.0,你现在就能使用SQL服务器展示Web 服务了.在SQLXML的Web 服务可以让用户执行存储过程,用户定义的功能,并且它们支持模板.       在这篇文章中,你将看出怎样展示一个作为Web 服务并构建一个简

创建.NET Web服务(转)

web|web服务|创建 Web服务是构造分布式.模块化应用程序的最新技术发展趋势.Web服务可以把业务逻辑划分一个一个的组件,然后在整个因特网的范围上执行其功能.本文就是向读者展示一个简单的.NET Web服务创建过程. 假如你过去曾经构造过微软世界的COM组件,那么你对创造可重用对象中间层的概念应该是比较熟悉了,正是可重用对象可以让开发者重用代码.利用由此带来的软件开发灵活性.这些组件能作为客户应用程序放在同一计算机上执行,或者以DCOM的形式在分离的机器上执行. 现在的.NET体系则把以上

从 SOAP Toolkit 迁移到 Web 服务

web 摘要:如何从 Visual Basic 6.0 和 Visual Basic .NET 访问 Web 服务,以及如何将现有的 SOAP 应用程序转换到 .NET 平台. 目标了解 Microsoft Visual Studio .NET 中的 SOAP 工具 回顾使用 SOAP 和 Visual Basic 6.0 访问 COM/COM+ 组件 从 Visual Basic .NET 访问 Web 服务 将 SOAP Toolkit 应用程序迁移到 Web 服务 前提条件了解什么是 We

使用Spring的Web服务模拟器框架解决方案

大型 Web 开发计划通常会由多个开发项目组成,这些项目由分布在不同地域的团队全天候同步进行. 由这些团队开发的各个组件需要尽可能实现无缝互操作.这类开发的关键要求是在负责构造不同组件的团 队之间建立好约定.一个好的模拟器框架通过实现各个接口约定所支持的全部请求和响应来保证尽可能的 团队独立性,并潜在地提高生产率.本文将描述在快速 Web 开发环境中使用模拟器框架,逐步演示如何 使用 Rational Application Developer 快速创建一个模拟器框架,并包含了一些示例与代码.

Java Web服务: Metro简介

Metro Web 服务栈是由 Sun Microsystems 开发的一个开源工具.它将 JAXB 2.x 数据绑定和 JAX-WS 2.x Web 服务标准的参考实现与其他与 XML 相关的 Java 标准相结合.Metro 还包括一些附加组件,以 支持基本 JAX-WS 服务的定义和使用以及 SOAP 消息交换的各种 WS-* 扩展. Metro 既可以用作独立的 Web 服务栈,也可以用作开源 Glassfish 应用服务器中的集成组件.如果 使用 Glassfish,尤其是在拥有配置基

Java Web服务: CXF简介

Apache CXF Web 服务堆栈是来自 Apache Software Foundation 的另一替代选择,Axis2 堆栈也来自同一组织.尽管它们来自同一组织,Axis 2 和 CXF 就如何配置和交付 Web 服务 采用完全不同的方法.在本文中,您将学习为 CXF Web 服务使用 JAXB 2.x 和 JAX-WS 2.x 的基础,还将比较 CXF 与其他 JAXB/JAX-WS 堆栈 - Axis2 和 Metro - 这两 个堆栈在之前的文章中讨论过. CXF 基础比较 在用户

用IE的Web服务建立ASP.NET应用程序

在建立商业网站的时候,开发者遇到的一种限制是只能把浏览器作为用户界面.例如,在很多情形中,用户希望在执行某些操作(例如输入雇员编号)之后从服务器检索到信息.为了达到这个目的,他们将把页面发回到服务器,检索雇员信息,并用从服务器上检索到的信息刷新页面.尽管目前这种刷新整个页面的方法很普遍,但是它的效率很低,因为Web页面刷新了,并且重新呈现了整个页面的内容,即使页面只要少量的部分真正地发生了改变.在搜索某个类别或者搜索引擎的时候你就可以注意到这种低下的效率.它的延迟和资源浪费非常明显.但是,如果相