论文导读:另一方面,随着Internet的迅猛发展,HTTP在Internet应用领域已经取得了绝对的领导地位,但是HTTP协议只能使用相当简单的命令(比如GET、POST和PUT)请求和发送数据,而不能在应用程序间自由地交换数据,实现信息和软件模块的共享,Internet应用领域的这种情况推动了SOA体系的诞生。CORBA和DCOM都是被设计用于分布式对象的客户/服务器模式的通信。随着分布式计算对于企业应用越来越重要,CORBA和DOOM竞争也越激烈,但实际应用中常常需要两者兼顾,这就需要DOOM和CORBA对象的互操作,目前比较流行是COM-CORBA桥或利用COM和CORBA兼容的API技术方案,但是他们执行效率比较低,实现也比较复杂,现在SOAP协议的出现,使得分布式对象模型之间有效、简单的通信成为可能。
关键词:组件模型,CORBA,SOA体系,SOAP协议
一 传统组件模型和SOA体系的简介
网络的快速发展,计算机使用者的不断增加使分布式计算日益受到重视。为了简化网络应用程序的开发和实现基于组件的软件骨架,逐渐演化出分布式的对象模型。分布式对象模型中,通常参与计算的计算体(分布对象)是对称的,分布对象往往又被称为组件,组件是一些独立的代码的封装体,在分布计算的环境中大多数情况下是一组相关对象的复合体,提供一定的服务。分布式环境下,组件是一些灵敏的软件模块,它们可以位置透明、语言独立和平台独立地互相发送消息,实现请求服务。
目前国际上,分布式对象模型有两大派COBRA和DCOM/COM。
另一方面,随着Internet的迅猛发展,HTTP在Internet应用领域已经取得了绝对的领导地位,但是HTTP协议只能使用相当简单的命令(比如GET、POST和PUT)请求和发送数据,而不能在应用程序间自由地交换数据,实现信息和软件模块的共享,Internet应用领域的这种情况推动了SOA体系的诞生。
SOAP和HTTP一样是一种应用级的协议,因此它可以直接建立在传输协议之上,比如TCP。可是,当今的Internet结构中还有代理和防火墙等介入,而它们只允许HTTP通过。论文参考网。为此,SOAP必须建立在HTTP之上,即任何允许HTTP通信的网络都可以通过SOAP消息。而HTTP已经遍及到各种计算机平台和设备,所以,建立在HTTP上的SOAP也将可以到达各种计算机平台和设备。
由于SOAP的最终目的是在应用程序之间实现通信,而Internet上应用程序运行的系统、开发应用程序的语言千差万别,所以为了使用SOAP在不同的系统和平台间交换数据,数据必须使用各种系统和平台都能够理解的格式。而XML和HTTP一样,几乎所有的计算机平台都能处理它。因此XML自然成了SOAP消息格式的选择。
使用HTTP和XML,SOAP可以基于现有的Internet基本结构,让运行在不同平台上的应用程序实现程序级的通信。SOAP为在一个松散的、分布的环境中使用XML对等地交换结构化和类型化的信息提供了一个简单且轻量级的机制。
二 传统组件模型CORBA
1.对象通信一般方法
建立分布式应用的两个主要通信模型是消息传递和请求/响应。消息传递允许通信任何一方在任何时间发送消息,一般用在祸合度较低的系统中,通常是与外部的并行进程进行通信。而基于请求/响应的应用更像一个单进程的应用,因为发送的请求或多或少被阻塞直至收到来自另一个进程的响应。这使得请求/响应通信更适合于RPC应用。
CORBA和DCOM都是被设计用于分布式对象的客户/服务器模式的通信。在这两种对象模型中,都是一个客户调用一个请求,该请求则由远方的一个对象来实现,远方的对象充当服务器的角色。提供服务的对象都有一个接口,该接口是通过接口定义语言(IDL)来定义的。由于接口的存在,使对象的实现过程对于客户是隐蔽的。CORBA和DCOM都是通过RPC和引用远程对象的方法来实现的。CORBA依赖于IIOP进行远程对象通信,DOOM则依赖于对象远程处理过程调用(ORPC)以达到相同的目的。CORBA体系结构是基于对象请求代理的;DOOM 则以COM作为它的基础,事务处理则依赖于MTS或MSMQ。
2.CORBA分布对象模型
CORBA(Common Object Request BrokerArchitecture)公共对象请求代理体系结构是由OMG组织制订的一种标准的面向对象应用程序体系规范,是得到承认的企业规模的分布式计算环境的中间件互操作标准。它由对象请求代理ORB、对象服务、公共设施、域接口和应用接口这几个部分组成。
CORBA制定了一套对象间通信的协议,通信介质被称为ORB(Object Request Broker)ORB提供了一种机制,通过这种机制,对象可以透明地发出请求和接收响应。分布的、可以互操作的对象可利用ORB构造可以互操作的应用。它负责在对象之间传递消息。ORB可看作是在对象之间建立客户/服务关系的一种中间件。基于ORB,客户可以透明地调用服务对象提供的方法,该服务对象可以与客户运行在同一台机器上,也可以运行在其他机器上通过网络与客户进行交互。ODB截取客户发送的请求,并负责在该软件总线上找到实现该请求的服务对象,然后完成参数、方法调用,并返回最终结果。
随着分布式计算对于企业应用越来越重要,CORBA和DOOM竞争也越激烈,但实际应用中常常需要两者兼顾,这就需要DOOM和CORBA对象的互操作,目前比较流行是COM-CORBA桥或利用COM和CORBA兼容的API技术方案,但是他们执行效率比较低,实现也比较复杂,现在SOAP协议的出现,使得分布式对象模型之间有效、简单的通信成为可能。
三 传统组件模型和SOA体系的消息传递
SOAP协议的出现,使得分布式对象模型之间有效、简单的通信成为可能。
1. SOAP消息系统的结构
1.1 SOAP的结构
SOAP首先是XML,是用XSD大纲定义的XML,所以一定包含XML元素,这些元素在一定程度上可以作为对象,每个对象有各自不同的目的。总体上看,SOAP消息包括以下3个主要元素:
1)SOAP<Envelope>:是整个SOAP消息的根元素,也是每个SOAP消息中必须有的元素其他两个元素都在这个元素内部。
2)SOAP<Header>是SOAP消息中的可选元素,如果有,必须是<Envelope>的第一个子元素.<Header>元素中包含多个头条目子元素。
3)SOAP< Body>是每个SOAP消息中都必须有的元素。如果Envelope消息中没有<Header>元素,那这个元素必须是<Envelope>元素的第一个直接子元素,否则它必须是紧接着<Header>元素的元素。<Body>元素中包括多个体条目,在该元素中还可以使用<Fault >元素,当出现错误时使用这个元素。
1.2 SOAP的消息系统
如果要在SOAP消息中发送某个XML文档,则需要创建一个SOAP消息,并在<Body>元素中包括这个文档即可。这样的SOAP消息通常成为“文档样式/字面格式”的SOAP消息。如果应用程序内部使用.NET对象表示请求数据,就可以使用.NET串行化类生成XML。
下面将创建一个Web服务,服务端接收发单XML文档,检验其中的数据,并返回一个收据号码。客户端向Web服务器发送包含发货单数据的SOAP消息。它们使用的都是文档样式/字而格式的SOAP消息。图1显示了这个例子的结构。

图1 SOAP消息系统结构
下面是包含发货单文档信息的请求消息,客户端使用HTTP把SOAP消息发送给Web服务。
〈soapenv: Envelope …〉 〈soapenv: Body〉
〈invoice xmlms=“http://schemas.mywebservices.com/examples/” 〉
<invoice Number > 123-CXF-9028 <invoice Number>…</invoice>
</soapenv: Body></soapenv: Envelope>
下面是Web服务返回的响应SOAP消息,其中包含收据号码,客户端获得这个消息,取得其中的收据号码。
<soapenv:Envelope…> <soapenv: Body>
<Receiptxmlns=“http://schemas.myWeb-services. com/examples/”>1000</Recerpt >
</soapenv: Body></soapenv: Envelope>
2SOAP消息系统的实现
2. 1服务器端设计
服务端的任务是接收客户发送的发货单数据,检验它的正确性,然后对其做相应的处理,比如存入数据等。如果发货单数据正确,服务器还要向客户返回一个包含收据编号的文档。
这里使用ASP.NET来实现服务器,使用VisualStudio.NET创建ASP.NET应用程序。文件名http://localhost/MessageServer/ Webform1. aspx。
程序的方法首先从Request中读取客户提交的发货单XML文档,然后取得<Body>元素,接着使用反串行化的方法,把<Body>元素中的XML文档串行化到类invoice的对象中,此后可以在应用程序中方便地处理发货单数据,比如把数据存入数据库等,方法的最后调用Write-SOAPRespons。方法向客户返回一个包含收据号码的SOAP消息文档。在实际应用中,收据号码应该来自数据库或者由其他信息决定。
2. 2 客户端设计
客户端的任务是把发货单数据发送给Web服务。客户端的实现涉及到两个功能:一个是与服务器建立连接,发送数据;另一个是根据SOAP协议的规定格式化一个文档样式/字面格式的SOAP消息。
2. 2.1与服务器通信
这里使用.NET的HttpWebRequest类来实现与服务器通信。为了把通信和格式化SOAP消息两个功能分开,把通信功能放在一个单独的类XML HTTP中,刀把该类放在一个文件(XMLHTTP. cs)中。下面是该文件的内容。
程序类的结构很简单,首先是3个私有成员,分别代表请求的响应消息(responseText)、HTTP请求(httpRequest ) 和 HTTP响应(httpRe-sponse) 。其次是3个公开的方法:0pen方法用指定的HTTP方法打开与指定URL的连接,并设置请求内容的M1M};格式Send方法向Http Re-quest写入流中写入数据,写完数据后,就可以读取服务器的响应内容;Set RequestHeider方法用于添加HTTP头,使用HTTP发送SOAP消息时需要指定SOAPAction头最后是ResponseString属性,返回响应内容。
2. 2. 2 格式化SOAP消息
SOAP消息有既定的格式,需要把发货单文档放到SOAP的<Body>元素中。这里把格式化的SOAP消息和使用XML HTTP类发送SOAP消息合并到了SOAPSender类中。包含该类的代码文件名为SOAPSender.cs。由于该文件很长,下面只用类的说明形式描述。
该类的CreateSOAPEnvelope方法用于创建SOAP消息的框架,也就是创建一个包含Envelope的XML文档。WriteBodyXml方法把指定的XML文档插入到<body>元素内部,也就是SOAP消息的<Body>部分。调用Send方法时将使用XML HTTP类打开与指定URL的连接,设置SOAP Action头,并发送SOAP消息。该类中的其他方法用于创建体条目、子元素和属性等。
1/2 1 2 下一页 尾页 |