浅谈Soap/Web Service架构及其应用

来源:互联网 发布:陈鸿一鸣 知乎 编辑:程序博客网 时间:2024/05/01 06:48

概述:随着计算机网络时代的到来,Internet/Intranet无可避免的成为现代商业信息化发展的必要趋势,而基于原有的局域网及企业内部网络的二层式甚至是单机式的信息服务结构已经不能满足现代商业社会的需要,分布式应用技术自然而然成了主流的开发技术。本课程设计主要讨论Soap/Web Service架构方式、原理及其在分布式开发中的应用技术。由于Internet/Intranet是一个多元化的计算环境,是由各种不同的实现技术提供的服务以组成一个网网相连的集成计算环境,那么必须使用大家都接受的标准,来集成彼此的服务,Soap和Web Service就是在这种需求下产生的标准,而且迅速地成为大家都接受的开放标准。可以看到各个知名的软件厂商的最新产品都把Web Service做为未来重要的技术来全力发展如:MicroSoft的Dot Net战略根本就是围绕WebService展开的,Inprise的Delphi Studio也把Soap/ Web Service做为重点,像Sun,IBM等厂商也以最快的速度为自己的产品中加入了对Soap的支持。所以可以预见Soap/ Web Service 是今后软件发展的必然趋势。名词解释:Soap: (Simple Object Access Protocol) 简单对象存取协议,1999年W3C组织公布的用于标准远程对象调用通用格式,以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制,目前最高版本1.2。Web Service: 一个比较抽象的概念,它把以往在Web上应用的面向程序设计的概念,转变为面向服务型的概念,与具体的软件操作平台无关,与服务器、客户端编写的程序语言无关,即不注重以什么技术来实现Web解决方案,而是关心提供什么样的服务让客户端调用。XML: (eXtensible Markup Language) 扩展型可标记语言。是国际标准化组织的标准通用标记语言 SGML 的子集。SGML 面向诸于飞机设计文档的大规模、长生命周期的信息储存,XML 则面向短期的临时数据处理、面向万维网络;二者是相互补充的关系。它是Soap的基础。Soap原理:通过阅读W3C网站中关于Soap的介绍说明(http://www.w3.org/TR/soap12-af/),我们可以了解到以下几点:①Soap其实是一个建立于HTTP上的上层协议(Wire Protocol电报协议,这里我觉得用上层协议更好一些)②使用Soap的目的是定义如何调用远程终端的中的服务(方法)。③Soap中用多个NameSpace标准来区别各个远程服务。④Soap中不仅可以封装简单的数据类型,还可以封装更加复杂的数据类型,如Struct(C或C++)、Record (Pascal)等。(P.S.由W3C网站上所提供的文档,我们可以了解到Soap封包的标准格式如下:HTTP报头(例如:POST /PWSDMO1.EXE/SOAP HTTP / 1.1)SOAPAction标签(指明了封包SOAP欲进行的工作。如:SOAPAction: “urn:FirstWSIntf-IFirstWS”)CR/LF标签(指明封包中XML的版本及编码所使用方法。如:SOAP-Env:这里可以保存多个报头元素,即多个命名空间。用<SOAP-ENV:Body>开始,</SOAP-ENV:Body>结束SOAP封包内容)所以有人说:Soap就是XML加HTTP。这描述虽然不准确,但的确可以概括Soap的基本意义。了解一项技术的原理,最好的方法莫过于站在一个开发它的工程师角度来看这项技术。要实现基于Soap的架构,首先我们要知道数据是如何通过Soap传递到远程服务器端的,其大致流程如下:首先,由客户端程序提出申请服务的要求,这个要求将被传递到客户端的处理机中,所有的申请的方法及方法所需要的参数被打成符合服务器服务标准格式的Soap封包中(即一个符合服务器服务标准格式的XML封包),这个封包通过HTTP协议传送到服务器端,然后由服务器的XML解析器将Soap封包转化为客户端申请的方法名及所有参数,再由编译器所提供的RTTI (RunTime Type Information)对应找到被申请的方法所在的调用堆栈地址,由服务器执行所需方法,再将方法返回的结果集通过处理机打包成XML封包传递回客户端,由客户端解析器将结果解析输出。

知道Soap的大致流程后,我们可以发现Soap的原理十分简单,实现它也比较容易,但这里基本上可以发现存在三处比较关键的技术需要解决:1、如何将数据打包成标准XML封包及它如何在Internet中安全的传送?2、服务器编写的语言如何与Soap封包间的互相转换?3、客户端如何了解服务器中所提供哪些服务及服务所需要的参数?就第1个关键技术,现在已经有许多种现成的技术可供使用,比如IBM的XML处理引擎,MS的XML COM等,需要注意的是如果选择MS的XML COM,你将无法向Window以外的平台扩展。(Delphi6的Soap开发工程师Rick Nadler就犯下这个错误,导致现在的Kylix的Soap解决方案要重新撰写J)。第2个关键技术是如何将Soap封包中所申请的方法转换为调用堆栈中的地址,这项工作非常底层,已经属于编译器技术的范畴,所以在这里只作简单描述:在客户端由编译器通过处理RTTI取得客户端运行期的属性,将其传送给处理机打包。服务器端通过RTTI找到客户端所需的服务地址,调用堆栈及传递参数。第3个关键技术是前面没有提到过的,客户端如何知道服务器端提供什么样的