曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
相应的代码称为S i m p l e O r d e r,我在此不打算仔细介绍它。如果你感兴趣,可参见《P r o f e s s i o n a l
DCOM Application Development》一书。
以下代码实现了接口的五个属性和一个方法:
程序清单1 8 - 1
766使用XML 高级编程
下载
正如你所看到的,每个属性定义了订单中的一个有效字段,它们被保存在以下本地成员变
量中:
程序清单1 8 - 2
第18章实例研究4—SOAP使用767 下载
这是在O r d e r. h中定义的。
然后,S u b m i t ( )方法将这些属性写入订单文件。除此之外还有一些辅助方法,它们用于处理
各种有效性验证选项(参见表1 8 - 2)。
表1 8 - 2
方法功能
M a n d a t o r y A l p h a b e t i c ( ) 检查值不为空,而且只包含字母
O p t i o n a l A p l h a b e t i c ( ) 检查值可以为空,或者只包含字母
M a n d a t o r y A l p h a n u m e r i c ( ) 检查值不为空,而且只包含字母和数字
O p t i o n a l A l p h a n u m e r i c ( ) 检查值可以为空,或者只包含字母和数字
M a n d a t o r y P r i c e ( ) 检查值不为空,而且是格式正确的价格
以下是这些方法的代码:
程序清单1 8 - 3
768使用XML 高级编程
下载
最后一个辅助方法Wr i t e ( )的功能是将一个字段写入文件:
程序清单1 8 - 4
在原来最初的例子中,我有一个简单的Visual Basic客户,它允许用户创建订单对象的远程
实例,以有效的方式获取字段值,然后提交它。在本例中,我计划将客户代码建立在以前的代
码的基础上,主要有以下两点原因: (1) 我希望说明S O A P不仅仅可以用于基于We b的应用程序,
(2) 我比较懒惰,不愿让代码闲置。
那么,如果我们准备使用S O A P,我们还需要什么?
第18章实例研究4—SOAP使用769 下载
18.2 SOAP Opera
我们需要依靠某种基础结构来管理这些,并且要为它命名(这是我真正喜欢的)。正如你所
想象的, S O A P迅速成为缩写词的滋生地,由此产生了许多关双语。例如,我最初考虑的名称
S U D S(代表Simple Usurper of DCOM using SOAP)很快就被排除掉了,因为它容易与S O A P
Uniform Description Semantics(S O A P统一描述语义)相混淆。因此,当我将SOAP OPERA公
诸于世时,心里不免战战兢兢。不管怎样, O P E R A可能代表“ Object Protocol Enabling Remote
A c c e s s(支持远程访问的对象协议)”,但是,这仅仅是个命名而已,不是吗?
如果我们使用纯D C O M,图1 8 - 2显示了系统的简化结构图:
图18-2
如果我们使用S O A P,系统结构图参见图1 8 - 3。
图18-3
为了使用O P E R A客户端,我们必须略微修改一下客户应用程序(当然,我们也可以为它提
供一个实现了I O r d e r接口的C O M对象,这样就能够在不改动任何代码的情况下使用它)。
O P E R A客户是进程内C O M对象,它实现了新的接口I O p e r a。我们将详细说明一下这个接口。它
与位于Tierra del Fuego的O P E R A服务器交换S O A P调用。然后,O P E R A服务器实例化C O M订单
对象,并通过本地C O M调用它们的方法。本例中的订单服务器与D C O M例子中的服务器完全相
同,但是在此它接收的都是本地访问。
比较以上两个结构图可以看出,O P E R A客户取代了C O M代理,有限协议由D C O M变为S O A P,
770使用XML 高级编程
下载
客户端应用程序
(Ulaanbataar)
客户端应用程序
(Ulaanbataar)
OPERA
代理
OPERA
桩
OPERA
服务器
OPERA
客户端
订单服务器
(Tierra del Fuego)
订单服务器
(Tierra del Fuego)
O P E R A服务器取代了COM stub(严格地说,O P E R A服务器仍然使用C O M代理/ s t u b访问订单服务
器,但是这主要是出于代码重用的考虑。假如我们重新实现订单服务器,情况就会有所改变)。
最后有一点要说明。对于本例,经验丰富的C O M程序员可能会坚持认为应该使用“定制
排列(Custom Marshaling)”。当然,我们没有理由不在订单对象中实现I M a r s h a l,以便每
个I O r d e r方法调用都会作为S O A P调用发送给服务器,它对应用程序来说是完全透明的。
然而,定制排列不在本例讨论范围之内,如果读者对此感兴趣,可以参考《P r o f e s s i o n a l
DCOM Application Development》一书的第3章,其中深入介绍了有关内容。
下面我们来详细介绍该系统。
18.2.1 OPERA客户端
首先,在客户端我们需要构造S O A P调用,并将它发送给服务器。
1. 定义接口
我们的客户端是非常简单的C O M对象O p e r a,要将它伪装为完全通用的。它只有一个接口
I O p e r a,其中包含一个方法(参见表1 8 - 3)。
表1 8 - 3
方法参数功能
E x c h a n g e ( ) [in] BSTR URL 与服务器交换S O A P调用
[in] BSTR Method
[in] VARIANT Arg u m e n t
因此,我们需要指定S O A P服务器的U R L,要调用的方法名称,以及一个参数。对于所有的
方法,只需要至多一个参数,所以这就足够了。另外,我们不需要返回值(正如我所说,它不
是特别通用的实现)。
你可能会有疑问,既然方法没有返回值,为什么称为E x c h a n g e ( )。实际上,确实存在着请求
/应答交换;然而,服务器唯一返回的是远程方法调用的H R E S U LT,然后它将作为E x c h a n g e ( )的
H R E S U LT返回给产生调用的应用程序。需要特别指出的是, 1 . 0版的S O A P规范并不强制要求请
求/应答方式。它定义了与H T T P的绑定,然而真正的协议是独立于传输的。你绝对没有理由不使
用S O A P进行单向方法调用—它有可能为M S M Q提供实现的基础。
2. 建立客户端
让我们详细分析一下内部的代码。我们将使用AT L,并将它实现为进程内C O M对象。我们
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程下(75)