Web Service 的测试报告( Delphi )
说明:使用 Delphi 操作一个 Web Service 是不复杂的,而创建一个 Web Service 服务及生成客户端调用相对都不难,在 delphi6 中有几个现在的组件精灵的,我们用它便可以向导式的生成我们所需要的接口方法,只是开头摸索的过程有点费劲,等把架子弄好之后,再往里添加新的方法时就很容易了,我下面将结合一个例子描述一下我的创建过程,并简单说明一下它的执行效率的测试,最后再和孙一波交叉测一下,比较一下优劣(各方面)。
测试环境: Web Service (以下简称 WS )放在本机上,走 IIS 的 Web 服务。客户端也在本机上,两端都是用 delphi6 所编写的。
时间效率:耗时主要费在两个方面,其一是 WS 的定位找寻;其二是数据库的连接及数据库的操作(主要耗在连接上,操作我认为几乎可以忽略)。
执行一个操作(如: Select 或 Insert SQL 操作)大概要半分钟左右,主要是第一次操作慢,如果你连着做几个动作,那个时间则要不了多久的。所以大头的时间都是耗在 WS 的定位网络时耗上。
在数据库的连接上,我做了两个实例,其一是用 ODBC 连接做相关操作,其二是用 ADO 连接做操作,这两个实例给我的人为感觉上差不多时间,没有太大区别,等你们测再看看了。
程序编写难度:除了那几个新组件要熟悉一下外,其余的都是 delphi5 里的东东,难度不是很大,也比较容易上手,如果有一个模式可以套的化。编第一个 WS 我花了一天多点的时间,主要是国内的站点上用 C #讲的比较多些,用 delphi 的则很难找到现成的例子,我是结合《程序员》杂志上及一两个国外站点上找的资料而写的。
下面我就把这个 Test 的思路流程及一些关键的技术给描述一下,给大家参考,希望能抛砖引玉,呵呵!
一、 服务器端实现
1 . New 一个 Application
2 .在 New Items 页选择 WebService 中选择 Soap Server Application ,系统会自动给你生成一个 Web Module ,里含三个组件:一个 TTPSoapDispatcher 组件 , 一个 HTTPSoapPascalInvoker 组件 , 和一个 WSDLHTMLPublish 组件,如下图:
第一个组件响应到来的 SOAP 请求而后将它们发送给我们的 Web 模块 . 第二个组件将到来的 SOAP 请求翻译成对我们的 Pascal 对象方法的调用过程 . 第三个模块产生基于我们发布的可调用界面的 WSDL, 以便外界能够得知如何使用我们的 Web 服务,这些我们可以先不管,因为这都是自动产生的,如果不想深入研究 WS 的机制的化,这些可先抛在一边,因为它们的功能已全部自已产生,不用我们去操心了。
3 .然后生成二个比较重要的文件,来描述我们这个 Test WS 能对外提供哪些服务的,据我摸索,这两个文件只能手工写,它们也是 WS 在 delphi 中的架子。具体怎么写可参看我的源码,在王剑白的共享目录中有。
4 .再生成一个数据模块,它是用来和数据库打交道的,有 TdataBase , TQuery (两个一个放有反馈结果的 SeleSQL ,一个是没有反馈结果的 ExecSQL ),这个 DM 在步骤三中接口实现中都会用上的。
5 .这些都做完后,编译生成 Exe 文件,一个 Web Service 就完全生成了, Pretty Cool , HuH! ,然后我们可以用 Http://localhost/Service/test/Itest/wsdl/Itest ,在 Brower 里就可以看到此 WS 的 WSDL 的描述了,一切就绪了,就等着调用了。
二、 客户端实现
说明:使用 delphi6 开发调用 Web Service 的客户端应用程序更简单了,因为它提供的 WebServices 组件组中的 THTTPRIO 组件是很方便的,只要我们设它的欲调用的 WS 的 WSDL ,那么 THTTPRIO 组件便可以自动的处理所有调用的 WS 的细节了。
步骤:
1. New 一个 Project Application
2. 在 New Items 页选择 WebService 中选择 Web Service Importer ,在提示框中输入 Http://localhost/service/test/Itest/wsdl/Itest ,也就是 WSDL ( Filename 或 URL ),系统会自动产生一文件,来描述我们的 WS ,这个我们也可以先不管,打开一看,里头有我们所定义的函数说明。
3. New 一个 Form ,拽入 THTTPRIO 组件,设好它的属性 WSDLLocation ,同样是上面那个串,选好它的 Port 和 Service 属性,我们该做的预备工作都做好了
4. 拽一个 Button 过来,写你想调用的方法就可以了。好了,全部完了!
有几点注意的地方:
1. 在 WS 方法实现文件中要创建数据模块,我的程序里用 CreateDM 私有函数来完成的,最后再 FreeDM 掉,千万不能在 Project 中用 Application.CreatForm ( TDM,DM )来完成,要不 WS 总会有错的。
2. 在 IIS 虚目录中,一定要选上执行 CGI 的权利那一项,要不也是不行的。
3. 在 New Soap Server Application 时,最好不要选择创建 DLL 形式的 WS ,要不编译时总要重起机子的,否则是不让编译的。
还存在的问题:
1 .调 WS 时,不能跟踪进去,不知有没有好的办法。
2 .除了 DM 方式操作数据库外,不知还有没有别的途径来,因为我想把数据库操作或者说业务逻辑部分建立在 WS 之上一层,让它先运行,驻留在内存中,这样以后 WS 再调时,就不用再与数据库连接,因为已建好,这样可能会大大提高时间效率的,这些问题,我想以后再慢慢想吧!