打印本文 打印本文 关闭窗口 关闭窗口
Delphi 6 Web Services初步评估
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1853  更新时间:2009/4/23 18:39:56  文章录入:mintao  责任编辑:mintao

Delphi 6 Web Services初步评估

这是我刚到现在公司的时候(2001年8月份)所作的一份测试报告,现公布出来,希望能对大家有所帮助。因为当时d6刚刚发行,Web Service方面还存在一些问题,当前的update 1 for D6已经发布,主要就针对Web Service做了大量的修改,已经能与MS相关的Web Service兼容了。可能下面文章内提到的部分内容在Update1有所变动,在此说明!

2000年6月22日,整个IT行业期盼着一个令人向往的新时代,因为今天美国微软公司正式对外宣布了.Net战略,并且确定每年为这个新的战略投入40亿美元的研发费用。.Net的思想彻底地把计算模式从单机、客户机/服务器和Web网站的方式转向分布式计算(Distributed Computing)。虽然DCOM和Corba是当今比较流行的分布式对象模型,然而它们都存在着仅能用于本地网络这个局限性,很难突破防火墙的限制,因此不能把整个互联网作为一个计算资源体系加以利用。.Net则通过一种称为Web Services的技术把分布在互联网上的各种资源有效的通过编程手段整合在特定的应用界面里。

作为.Net的核心概念,Web Services是目前炙手可热的技术,各大厂商,如Microsoft、IBM、SUN等莫不投入大量的资源以求站在领导地位。Borland公司于2001年6月份发布的最新的RAD工具Delphi 6.0,并且把支持Web Service开发作为最大的卖点。近日,我对Delphi6创建Web Services程序进行了初步的测试和评估。

 

一、       Web Service概述:

Web Services就相当于过去我们编程中常常调用的API函数和在面向对象编程中调用

的接口,只不过API存在于本机上,接口通常存在于本机或者本地局域网内,而Web Services则将无所不在地分布在整个互联网络上。

Web Services可以真正的实现跨平台远程过程调用RPC(Remote Process Call),无论采用何种操作系统,无论采用何种构架的硬件,无论采用什么语言调用,都能够处理它的的调用请求。因为Web Services是由SOAP(Simple Object Access Protocol)作为封装协议,HTTP(Hypertext Transfer Protocol)作为通讯协议组成,并且通过WSDL(Web Services Discription Language)描述服务接口等信息。

SOAP,定义了客户端调用服务器端接口方法的一种机制。由于SOAP是基于扩展标记语言XML(Extensible Markup Language)标准文档方式,因此它可以轻松的实现跨平台,它使用XML定义了一套编码规则,用于网络上传输调用请求信息以及回应信息。

HTTP,作为WWW(World Wide Web)所使用的通讯协议,因为防火墙对各个端口进行监控,而HTTP使用的80端口用于Internet访问,通常防火墙不会限制此端口通信,所以一般可以通过防火墙,与连接在互联网上的机器通信。

WSDL,用于描述当前Web Service的各种信息,以便与客户端通过WSDL来取得调用接口的信息。

 

 

二、       评估测试过程:

整个评测的目标是验证Delphi 6对建立Web Services工程的支持程度,Web

Services的工作效率,以及与其它厂商Web Services的整合兼容性。

   

测试环境:

CPU:PIII 550

内存: 256MB

OS: Windows2000 Server + SP2

Web Server:IIS 5.0 + SP3

开发环境:Borland Delphi 6.0 Enterprise

          Microsoft Visual Studio 7.0 Beta 2

          Microsoft SOAP TOOLKIT 2.0

 

基本测试过程:

Web Services通过接口方法调用返回值来获取调用结果,因此测试程序通过调用不同类型返回值的接口方法来作为测试方向,分为以下四种:字符串类型返回值,对象类型返回值,对象数组类型返回值和二进制文件返回值。

 

1、  TEST1(字符串类型返回值方法调用):

首先采用Delphi 6创建一个Web Services工程,Delphi 6通过向导自动生成一个单元,此单元包括了Web Services通讯所需要的各个控件:THTTPSoapDispatcher用于响应基于SOAP的请求,并转交给其它的处理控件;HTTPSoapPascalInvoker用于从THTTPSoapDispatcher接收SOAP消息,并进行分析调用合适的接口方法,最后对接口调用返回结果进行封装(Encode);TWSDLHTMLPublish则是用于公布描述此Web Service接口的WSDL文档。

要为Web Service服务提供接口方法,需要建立一个从IInvokable继承的接口,以及从TInvokable继承的实现此接口的对象。

下面,我们就可以为这个Web Service添加方法了。在这第一个评估测试中,我们需要添加一个字符串类型作为返回值的方法,而且为了尽量准确的测试响应效率,我们希望能传输比较大数据量的字符串。因此创建了一个1024个‘Hello, The World!’组合的字符串作为方法的返回值。

调用结果如图一所示:

(图一)

客户端的调用,顺利取得了服务器端的字符串并显示出来。毕竟服务器对返回值的编码也是文本类型,所以说码耗费的时间并不多,因此整个请求的效率还是可以让人满意的。

当然,正是因为Web Services是基于SOAP的,传递文本自然是“拿手好戏”,但在    我们实际应用中,需要的结果通常来说不是字符串文本,而是别的信息,为了继续

证明Web Services将会带给我们的惊喜,我进行了下一个测试。

 

2、  TEST2(对象类型返回值方法调用):

在实际应用中我们常常会遇到客户端需要的是从服务器端返回数据库查询结果,在这种情况下,返回的数据可能是各种类型数据的组合,这个测试将会告诉我们如何通过Web Services传递复杂类型资料信息。

传递的复杂类型资料信息可以通过对象进行封装,便于创建于使用中的管理,更重要的是因为Delphi“强迫”我们不得不这样做。在Delphi 6中,如果接口返回值为对象,则此对象必须是从Tremotable类继承下来,并且对客户端能访问的成员变量必须作为属性公布。

针对测试,我创建了一个从Tremotable继承的类TXSPerson,并且公布了六个属性:ID、Name、Age、Gender、Content、Email。因此我可以在客户端通过方法访问这个类实例的这六个成员变量的值。在服务器端,我分别对这六个值进行了赋值,并把类作为方法的返回值。客户端的调用此方法得到TXSPerson类型的对象实例,从而访问它的个属性值。

调用结果如图二所示:

(图二)

从上面的结果可以看出,传输对象的效率就没有传输字符串高了。首先一点,在服务器端程序和客户端程序都必须管理一个类,相对于传递字符串多了这些类的管理开销,自然影响了效率。

从这个测试中,我们可以传递复杂类型的资料了,对于绝大多数的实际应用来说,每次传递已比资料是不够的,我们可能需要的是大量的数据库记录传递。在Web Services中,可以通过使用动态数组来实现,正如下一个测试。

 

3、  TEST3(对象数组类型返回值方法调用):

当服务器端的一大笔数据库记录需要传递给客户端,每一条记录作为一个对象实例保存,所有的记录用一个对象数组保存,并且以对象数组作为返回值传递到客户端。在这个测试中,我采用了与数据库结合的方式进行测试,以便于去更真实的模拟实际的应用。数据库我采用了Access2000,通过ADO(Microsoft ActiveX Data Objects)进行连接访问,并创建一个动态数组保存查询的各个字段的结果,作为返回值返回到客户端。

调用结果如图三所示:

(图三)

可以看出来,调用仍然非常顺利,客户端获得了期望的资料纪录。但是相对于传输一条记录来说,效率再一次的降低了。应该说来是因为动态数组的原因导致了效率的降低,动态数组是Delphi的一个特征,在C/C++中是没有动态数组的,所以C/C++中数组的内存都是在编译期间分配的。而Delphi中引入了动态数组,这使得只能在运行期间动态的分配内存,从而导致了对动态数组管理所引起的开销,

[1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口