• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

S O A P,并且它们都能够使用带有“ t e x t / x m l”内容类型的动词P O S T。防火墙通过迫使
SOAP使用强制性方法以至WebDAV请求被完全阻止。
S O A P的0 . 9版本使用“t e x t / x m l - S O A P”内容类型来解决这个混淆,但是这已经很少提及。
第11章服服务器到服务器使用477 下载
作为一个有用的分辨器,我认为它将成为最终正确的选择,因为对内容类型的提出并不
是随意的。0 . 9版本也有另一个解决方案,它对S O A P请求报头进行限制。它可能成为一个
对X M L - R P C爱好者的让步。即允许一个S O A P请求与一个简单的P O S T一样,在起始部分
什么也没有。但是如我所说,这将无法分辨一个请求是否为SOAP请求。
11.4.2 实现
我们将关注S O A P实现中较X M L - R P C的高明之处。现在,不再孤立地定义S O A P规范,将逐
步建立了一个S O A P客户和服务器。在这个过程中,将介绍该标准中的一些关键点。
这一节的代码包括在网上本书的可下载代码部分。
模块结构
有两个我们必需建立的模块—一个用于客户系统,另一个用于服务器系统。因为有某些
函数同时在客户和服务器上执行—例如建立有效载荷—那么我们也需要创建一个普通处理
模块。
(1) 客户模块
我们将从显示一个调用的代码开始。尽管远程调用的思想是在另一个服务器上执行一个函
数,我们仍希望尽可能地像一个正常的功能调用那样实现远程调用。例如,一个用来在数据库
里得到第一个作者的名字本地调用可能有如下形式:
程序清单11 - 9 5
那么我们希望远程调用有如下的形式:
如果你使用某种语言如C或者C + +(请参见本章后面部分的C + +实现例子)来实现S O A P客户
和服务器,那么将很容易通过参数数量的变化来处理调用。但是,我们将演示用A S P来建立一个
S O A P实现工具,因此仅能够传送预先给定数量的参数。为了避免该种限制,我们总是传送一个
参数,它是一个数组。该数组将包含真实的参数。这样,参数的多少就可如你所愿。
一个客户请求的例子如下:
程序清单11 - 9 6
478使用XML 高级编程
下载
在这个例子里我们向远程过程( g e t A u t h o r)传送两个参数。从该调用的任何返回值将放在
变量o R e t里,任何成功或失败的状态信息将放在变量i R e t里。该远程过程被函数S O A P()激活,
如果你正在实现自己的系统,那么能够使用任何你认为有意义的名字。
在远程服务器上这个过程做了些什么呢?它返回了一批作者名,他们的I D都是大于或等于
第一个参数的。在这个例子里,该参数的值来自于一个可变的表单。至于确切地返回作者的数
量,将通过第二个参数设置—在这里用“1”。这个程序将在后面被用到。
你可能注意到这里有两个i n c l u d e文件,并想知道为什么我们不包含S O A P C l i e n t . a s p中的
基本模块S O A P. a s p,这样就而只需要包含一个。在绝大多数情况可以这样做,但是,后
面我将向你展示这样一种情形,即我们想建立一个既是客户又是服务器的应用程序。在
这种情况下,将使基本模块被包含两次。因此,最好将此模块独立于客户和服务器模块
之外,是否包含,依需要而定。当然,如果你使用的是一个比A S P更高级的环境,那么
你能使用条件包含来避免这个问题。
(2) 调用
让我们看一看当执行调用时发生了什么。下面这段代码在S O A P C l i e n t . a s p内:
程序清单11 - 9 7
该调用被传送到另一个函数—d oCall( )—它做实际的处理过程。SOAP( )过程必须包含
它自己,让调用者知道处理是成功还是失败。
那么远程调用实际做了什么呢?这是一个过程的开始,如你所见,首先的任务是准备一个
调用的有效载荷:
程序清单11 - 9 8
第11章服服务器到服务器使用479 下载
(3) 有效载荷
创建一个有效载荷是在客户和服务器双方都需要做的工作,因此,有效载荷函数存在于通
用模块—S O A P. a s p内。
像使用X M L - R P C,有效载荷由一些实际的数据组成,这些数据是我们将要传送的。它们被
包含在一个非常严格的消息包里以保证这些数据能够被正确地抽取。有效载荷的实际格式随着
对有效载荷的不同请求情况而不同。例如,承担一个方法调用消息的有效载荷与传送调用结果
的有效载荷不同。S O A P为调用、返回和错误报告提供不同的有效载荷。
尽管有三种形式的有效载荷,但它们还是有一些共同的特征:
• 它们都包含于叫做< E n v e l o p e>的元素。这个元素必须属于S O A P命名空间。
• <E n v e l o p e>元素顺序包含一个< B o d y>元素,它也是在S O A P命名空间内。这些条件意
味着总是有如下这种模式:
程序清单11 - 9 9
现在能够编码有效载荷函数,它包含任何已经定义过的子元素,不论是一个调用、一个响
应或是一个错误:
程序清单11 - 1 0 0
480使用XML 高级编程
下载
注意<E n v e l o p e>元素也包含对于数据类型的命名空间定义,像早些时候讨论的那样。正常
情况下,仅需要加入x s d命名空间,但作为一个过渡性的方法,也为X M L - D R加了命名空间,因
此能从Microsoft XML DO M(在第7章有全面的解释)得到分类的数据。这个元素可以包含任意
数量的命名空间定义,只要你想要。并且它也包含另外的属性,这些属性也满足命名空间的要
求。
我们已经有了创建一个有效载荷的函数,该有效载荷又是包含了任意子元素的,因此需要
一个一般过程来创建那些子元素。一个用于调用,一个用于对调用的响应,一个用于错误指示。
(4) 方法调用和响应
调用和它们的响应使用方法的名字,该名字位于传输的命名空间。响应将“ R e s p o n s e”附
加到方法的名字上,因此我们可有如下调用:
程序清单11 - 1 0 1
得到响应如下:
程序清单11 - 1 0 2
 
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML高级编程上(149)