Delphi 6 Web Services初步评估之三(转)

 

Delphi 6 Web Services初步评估之三(转)
★ 测试总体印象:
在整个测试中,对Delphi 6创建的Web Services有以下几个印象:
1、 客户端应用程序连接服务器端Web Service的时候,第一次调用很慢,而以后的调用明显加快。
图五显示了调用各个接口第一次和第二次的传输速率(每秒钟传输千字节数KB/S)。
由此可以看出,第一次的方法调用非常耗时,可能达到第二次调用的8倍,因此可以确定,第一次调用接口的时候,大量的操作事件耗费在连接的建立上面。一旦连接建立,以后的调用速度会大大加快。
(图五)
从图五中,也能明显的看到各种不同返回类型测试的效率高低。
2、 抛开第一次方法调用耗时以外,某些方法每次调用测试数据传输速率不稳定。例如测试TEST1和TEST2中,基本上速率为850KB/S或者1134KB/S,而TEST3的传输速率变化则非常广,从401KB/S到530KB/S都随机出现,而TEST4的测试因为速率太小,可能导致比较大的误差,在此不做考虑。
TEST1、TEST2相对测试比较稳定,是因为服务器端是直接返回了所需要的值,速率的变化仅仅来至于传输过程。而TEST3中必须从数据库中读出数据,并且创建了动态数组来传递资料,因此出现速率影响因素较多,导致传输速率变化比较大。
★ Web Services兼容性问题测试:
正是由于Web Services的火热,导致各家大厂商闻风而动,并且推出自己相关的概念,建立自己的方案。例如SUN公司推出ONE (Open Net Environment)的概念对抗微软,Oracle公司则以Dynamic Web Service的概念表示与微软抗衡。
SOAP的规格在不断的发展,从0.9、1.0到现在的1.1。但是,目前市面上提供SOAP功能的软件并不一定都符合最新的SOAP规范,即使是支持相同SOAP版本规格的软件,对于如何实现可能都有一些差异。但是,可能正是由于这一些细微的差异可能造成软件开发人员的困扰,更何况Web Services是以SOAP为基础的沟通技术。因此,如果不同SOAP软件接口对于SOAP规格的实现有所不同,将会造成客户端应用程序无法和Web Service沟通,或是在Web Service和Web Service之间无法使用彼此提供的服务。这样将会失去SOAP和Web Services技术的精髓。
下面的测试采用了当前最流行的两个平台进行兼容性测试,Microsoft Visual Studio 7 Beta 2版本,和刚刚发行的Delphi 6 Enterprise。
在前面的测试中,我采用Delphi 6创建Web Services,并用Delphi 6开发客户端进行连接,整个过程非常完美。然而现在,我们的测试一下是否当前最火的两个开发工具能“和平共处”呢?
首先,我在VS7环境下面,使用C#创建了一个Web Services,提供一个方法AddXY( int x, int y);然而当我在Delphi中调用的时候,很让人失望,出现了如图六的调用错误:
(图六)
看来,VS7和Delphi6还不能很好的合作到一起。当使用MST2(Microsoft Soap Toolkit 2.0)带的追踪工具Trace Utility拦截HTTP信息,察看传递的SOAP信息。发现VS7开发的Web Services的SOAP和Delphi6开发的Web Services的SOAP有一些不一样。正是因为这些格式的不一样,导致了它们之间沟通的失败。
而且不但SOAP格式不太一样,连WSDL的格式都大相径庭,以至于Delphi 6导入刚才我们在VS7下写的方法public int AddXY(int x, int y)以后,生成的接口声明如下:procedure AddXY(var parameters: AddXY); stdcall;因此产生了很让Delphi自己“尴尬”的事情,这是一个procedure而不是function,调用这个方法没有返回值,也就是得不到方法调用的结果,虽然生成的接口方法中参数parameters为AddXY类,并且是一个var类型的参数,可惜,很遗憾,客户端所需要的结果并没有包含在AddXY类中。而Delphi为这个方法声明了一个结果类AddXYResponse,可是我们却无法通过调用方法得到这个对象实例。通过进一步对接口描述文件WSDL的分析,发现Delphi 6对WSDL文件的解释存在某些BUG,导致了生成接口声明出现错误的问题。
总的来说,当前Microsoft和Borland之间的Web Services方案看来还是存在着很大的不同点。但是这并不是说我们就不能在delphi下面调用VS7创建的Web Services方法。我们还是可以通过MST2提供的COM接口进行访问。通过我的测试,这种方法没有问题,能够顺利的调用VS7的Web Services的各个方法,毕竟MST2和VS7 Beta2都是微软的产品。
当然,它们之间的不兼容,让我们很伤脑筋,作为当前的两大主流开发环境,竟然不能让我们体验到Web Services跨平台、跨语言的优越性,实在让人有些失望。
毕竟SOAP和Web Services标准以及技术仍然处于快速的发展之中,因此目前各家实现的细节可能会稍有不同,也许等到SOAP功能规格成熟之后,就不会再有这些恼人的细节问题。据资料介绍,Delphi 6的Web Services是能够顺利的整合到许多由Java实现的Web Services或是Java客户端应用程序,看来,Borland Delphi 6的Web Services实现还是偏向于IBM的阵营!
★ 创建Web Services的技巧:
1、 IIS 5中的相关设置:
因为Delphi 6创建的Web Services是一个ISAPI(Internet Server Application Programming Interface)程序,所以必须使用IIS作为它的服务器。在实际的开发和应用中,应该注意一下关于IIS5中针对ISAPI的缓存设置问题。
启动Internet服务管理器,选择Web站点的“属性”,依次选择弹出对话框的“主目录-〉配置”将会弹出如图七所示的对话框。

(图七)
在Web Service服务器端程序设计期间,因为需要不停的修改、编译和测试程序运行,所以不能使用“缓存ISAPI应用程序”,否则一旦运行程序,服务器程序就会总是处于使用期间,重新编译的新程序无法覆盖。
而一旦服务器端程序完成以后,则最好选择“缓存ISAPI应用程序”,因为一旦运行ISAPI程序它会被调入缓存以后,在以后的执行中效率会大大提高,据测试,至少有一倍以上的提升幅度。
2、 Delphi 6创建Web Services工程的调试方法:
作为一个运行于IIS下的ISAPI应用程序,Delphi创建的Web Services是一个DLL动态库,所以调试方法和一般的应用程序不太一样:
在创建Web Services程序的向导中,应该选择Web App Debugger excutable程序,创建出来的将会是一个可执行程序。然后使用Delphi 6自带的“Web App Debugger”调试工具作为Web Sever,并设置对应的端口,这时候就可以在Delphi的IDE下面调试服务器程序了。
当程序调试运行正常以后,需要作为ISAPI发布,只需要重新建立一个Web Sercices ISAPI程序,并把调试程序下的相关文件全部加入到新工程就可以了。
三、 总结:
在以上的测试中已经证明了,Web Services能传递各种各样的资料形式,由于Delphi已经为它封装了底层类进行传输复杂类型资料,因此,用Delphi6开发Web Services也比较简单。当前面临的主要问题就在于与Microsoft之间的整合问题,Delphi 6对微软WSDL的解释出现错误,和一些其它的相互之间差异,导致它们之间无法相互调用。虽然可以在Delphi 6中使用MST2进行调用,但是这就等于抛弃了Delphi 6自身的Web Services支持。
在整个测试过程中,我主要注重了Web Services实用性方面的测试,Web Services虽
然在传输效率极稳定性上都还不是特别的理想,但是毕竟微软的.Net战略是一个对现在来说超前的概念,它的真正成熟必须依靠与宽带网络的普及,才能让用户体验到Web Services的优越性。
当前,国内对Web Services的研究才刚刚起步,各大论坛才新近推出相关的讨论版,而且相对比较冷清。作为今后软件技术的核心概念,Web Services的火热程度将会有增无减。
随着各软件厂商参与Web Services研发的积极性,正促使着Web Services的迅速发展,以及相关协议的确定。随着外部环境的日趋成熟和自身的完善,Web Services必然作为全新的软件开发理念席卷整个行业。正如微软所说:“Empower people through great software -- any time, any place and on any device.”(先进的软件让人们随时,随地,通过任何设备获得强大能量)

参考资料:
《肥皂的战争与和平》----- 李维
《.Net:解读微软互联网新战略》-----毛向辉 陈志红
《Borland Delphi 6 Help》
《Borland Delphi 6 for Windows Develper’s Guide》

Delphi 6 Web Services初步评估之三(转)的更多相关文章

  1. Delphi 6 Web Services初步评估

    Delphi 6 Web Services初步评估这是我刚到现在公司的时候(2001年8月份)所作的一份测试报告,现公布出来,希望能对大家有所帮助.因为当时d6刚刚发行,Web Service方面还存 ...

  2. Delphi 6 Web Services初步评估之二(转)

    Delphi 6 Web Services初步评估之二(转)   ★ 测试环境:CPU:PIII 550内存: 256MBOS: Windows2000 Server + SP2Web Server: ...

  3. RESTful Web Services初探

    RESTful Web Services初探 作者:杜刚 近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTf ...

  4. Java与.NET 的Web Services相互调用

    一:简介 本文介绍了Java与.NET开发的Web Services相互调用的技术.本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用 ...

  5. 【转】RESTful Web Services初探

    近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTful风格的Web Services,比较著名的包括Twit ...

  6. RESTful Web Services简单介绍

    近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTful风格的Web Services,比较著名的包括Twit ...

  7. Web Service 初步了解

    Web Service见名之意就是网络上的一些服务,解决的问题就是如何使用这些服务,因为软件的开发有各种各样的语言,利用Java,C#,VB.NET,PHP等等,如何使这些语言编写的程序能够进行互通, ...

  8. Google Maps API Web Services

    原文:Google Maps API Web Services 摘自:https://developers.google.com/maps/documentation/webservices/ Goo ...

  9. .NET RESTful Web Services入门

    很早之前看到过RESTful Web Services,并未在意,也没找相关资料进行学习.今天偶尔有一机会,就找了点资料进行研究,发现RESTful真是“简约而不简单”.下面用示例来说明: 1 项目结 ...

随机推荐

  1. SqlSugar常用查询实例-拉姆达表达式

    SqlSugar支持拉姆达表达式查询,匿名对象参数等,相对还是比较方便好用的. 一.查询列表: //查询列表 SqlSugarClient db = SugarContext.GetInstance( ...

  2. Windows I/O模型、同步/异步、阻塞/非阻塞

    转载自:http://www.cppblog.com/tx7do/articles/5954.html 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.按照这个定义,其实 ...

  3. linq按需查询

    将不确定变成确定~LINQ查询两种写法,性能没有影响,优化查询应该是“按需查询” 如果在linq中希望进行一对多的复合查询时,请直接在查询中使用join into,或者使用let 关键字,当然在建立实 ...

  4. Java23种设计模式之单例模式

    一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点:  1.单例类只能有一个实例:  2.单例类必须自己创建自己的唯一的实例: ...

  5. 读懂IL代码(四)

    这一篇是IL系列的最后一篇的,主要是要说一下IL中的流程控制.我相信,经过前面三篇的介绍,看IL代码应该不是什么大问题了吧.好吧,闲话不多说了,就来简单的说一下吧. 还是跟前几篇一样,以例子来解释说明 ...

  6. vertical-align的深入学习

    W3C官方对vertical-align属性的定义有4个方面:    (1)vertical-align属性用于定义“周围的文字.inline元素以及inline-block元素”相对于该元素基线的垂 ...

  7. ecshop标签

    页面标题         {$page_title}页面关键字       {$keywords}     产品分类                 父分类列表 {foreach from=$cate ...

  8. 【C语言】测试系统各数据类型大小代码

    测试各系统不同数据类型大小代码 一.相关基础知识 不同环境下各数据类型大小可能不相等,(某些环境下,类型带下可以选择)故测了就知道! 二.具体内容 三.分析总结 四.实例测试 #include< ...

  9. require.js 入门学习-备

    一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...

  10. 扩展原生js的一些方法

    扩展原生js的Array类 Array.prototype.add = function(item){ this.push(item); } Array.prototype.addRange = fu ...