一:为什么需要soap? 随着计算机技术的不断发展,现代企业面临的环境越来越复杂,其信息系统大多数为多平台、多系统的复杂系统。这就要求今天的企业解决方案具有广泛的兼容能力,可以支持不同的系统平台、数据格式和多种连接方式,要求在internet 环境下,实现系统是松散耦合的、跨平台的,与语言无关的,与特定接口无关的,而且要提供对web 应用程序的可靠访问。 随着异种计算环境的不断增加,各种系统间的互操作性就愈显得必要,要求系统能够无缝地进行通信和共享数据,从而在 internet 环境下,消除巨大的信息孤岛,实现信息共享、进行数据交换,达到信息的一致性。web services 希望实现不同的系统之间能够用"软件-软件对话"的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现"基于web无缝集成"的目标。 今年四月份的时候,w3c联盟召开了第一次 web 服务专题研讨会,目的为探索 w3c 应向哪个方向发展才能实现新兴的 web 服务架构的标准化,期间提出了一个"web 服务堆栈"的构想,如下图,从图中可以看出,soap在web服务堆栈中作为用于 xml 消息传递的一种非常普遍的协议,发挥着十分重要的作用。
com/dcom(component object model / distributed component object model )是微软公司提出的分布式组件对象模型标准,支持在局域网、广域网甚至internet上不同计算机的对象之间的通讯。dcom基于com的应用程序、组件、工具等的基础之上,处理网络协议的低层次的细节问题,而不必关心太多的网络协议细节,从而使用户能够集中精力解决用户所要求的问题。dcom位于应用程序的组件之间,将组件以不可见的方式胶合在一起组成具有完整功能的应用程序。
soap 与corba,dcom/com的比较。 3.1 首先指出的是soap不会取代corba,com/dcom,三者的概念有所区别。com/dcom是个组件模型标准,corba是分布式应用的服务标准。corba和dcom为分布式应用程序建立服务,服务对象来执行客户端调用的服务。而soap是基于xml和http的分布式对象的通信协议,是com/dcom和corba对象进行通讯的协议。实际上,利用soap的互操作性和corba强大的执行能力,两者可以很好的结合在一起。 omg (object management group responsible for the corba specification)正在关注这方面的发展。 3.2. corba应用程序和dcom应用程序不能实现互操作,两者不能在一起协作。因为在orpc(object rpc)协议中,用objref代表了一个正在运行对象的引用;在corba/iiop(internet inter-orb protocol)中,用交换可互操作对象引用ior(interoperable object reference)代表一个服务器的对象引用。不幸的是,ior 与 objref不能够关联起来。然而,使用soap可以实现在垂直应用层面上corba ,dcom技术的水平整合,能够更好的集成corba,dcom为一个整体。 3.3 soap并没有定义信息的语义,服务质量,基于internet的事务处理。而是采用 xml 进行消息编码,正确的处理需要服务器和客户端本身来执行,理解和执行彼此使用的信息格式(one-to-one,request/reply,broadcast,etc),应用程序本身在语义解析中扮演着十分重要的角色。而corba,dcom表示了传送信息的语义,对参数和返回值使用二进制编码。可对诸如参数名称或类型的任何元信息都不编码,但使中介很难处理消息。又因为每个系统使用不同的二进制编码,系统间的互操作的很难实现。 3.4 尽管corba可以在不同的平台上执行,dcom可以在微软的各种平台上运行,但是基于corba和dcom的解决方案必须依赖于单一的应用程序。比如说,假如运行的是dcom服务器程序,所有的分布式的客户端不得不运行于微软的操作平台上。corba 虽然可以运行于不同的平台,但corba的互操作性并没有在更高层的服务上进行扩展,如安全性和事务处理,在这种情况下,许多提供的服务没有得到很好的优化。dcom和corba适合于服务器--服务器间的通讯,但是对于客户端--服务器的通讯十分脆弱,尤其当客户程序分布在internet上更是如此。 3.5 soap不象dcom一样试图定义分布式系统的所有元素,soap没有提供分布式类库,类型安全检查,版本控制等等,soap比它处于一个更低的层次,有点类似于iiop在corba的作用,dcom却提供了一些额外的协议功能,是iiop 或者soap所不具备的。然而,许多. dcom的额外功能只有在服务器――服务器间通信时才会用到,对于客户端――服务器之间的通信则是多余的。