用Delphi7开发Web Service程序 转

转:http://rosehacker.blog.51cto.com/2528968/450160

用Delphi7开发Web Service程序,并把服务程序放在IIS Web服务器上提供给各种客户程序调用。

一编写服务程序

第一步:File----->New----->Other------>WebServices----->Soap Server Application

选择ISAPI/NSAPI Dynamic Link Library然后确定,(如果没有做过,在接下来弹出的对话框中,可以输入服务名后,勾选右下边的general sample application,产生一个简单的例子,如果做了这一步,则下面的二三步都可以省略很多)。生成一个框架。后面的大部分原代码都需要自己手工添加;

第二步:定义一个接口单元。先通过向导生成一个空的单元文件,然后在此单元中实现基本的接口(Iinvokable)和定义以后客户端程序可以调用的方法,原代码如下:

unit unit1;

interface

uses InvokeRegistry;//基本的结构和方法的定义都在此单元中,必须引用

type

IWebTest=interface(Iinvokable)//自定义的一个结构,继承自Iinvokable

['{A436B0D2-D490-4C80-820A-355D979E8704}']//通过Ctrl+Shift+G生成的一个GUID

function gettext():widestring;stdcall;//自定义的一个方法,也是以后客户可以调用的方法

end;

implementation

initialization//初始化

InvRegistry.RegisterInterface(Typeinfo(IWebTest));//通过此方法来注册接口

end.

第三步:实现第二步中所定义的接口和方法。先通过向导生成一个空的单元文件,然后定义自定义接口(IWebtest)的实现类。原代码如下:

unit Unit2;

interface

uses InvokeRegistry,Unit1;//引用自定义的接口单元

type

TWebTest=class(TInvokableClass,IWebTest)//定义实现类,此类必须继承自TInvokableClass,并实现自定义接口

protected

function gettext():widestring;stdcall;//申明在自定义接口中所定义的方法

end;

implementation

{ Test }

function TWebTest.gettext: widestring;//实现自定义方法

begin

Result:='Success';

end;

initialization//初始化

InvRegistry.RegisterInvokableClass(TWebTest);

end.

第四步:编译整个应用程序,即产生一个*.dll的程序,把此程序拷贝到IIS的Cgi-bin目录下(或者自已在IIS中创建一个虚拟目录并指向dll所在的文件夹,在虚拟目录属性中,必须将执行权限改为:脚本和可执行文件),然后即可通过以下方式的链接访问到Wsdl:http://127.0.0.1/cgi-bin/*.dll/wsdl访问到以XML方式编码的Wsdl文件了,这就是客户端程序调用需要的文件。其中*.dll为你自己的应用程序的名字。127.0.0.1为你的Web服务器地址。Cgi-bin为你的Web服务器的可以执行Cgi程序的目录名称或 虚拟目录名称。

二编写客户程序:

第一步:新建一个Application。

第二步:File----->New----->Other------>WebServices----->Soap Services Importer

然后在Wsdl or Xml Schema Location中填入:http://192.168.1.222/cgi-bin/*.dll/wsdl/IWebTest,然后确定即生成了一个新的接口定义单元。新的单元如果要修改,可以参照我之前写的delphi调用webservices中的修改方法修改(加上uf8编码和idocument)。

第二步:在主form上放上一个按钮, 并引用第二个单元(即通过Soap Services Importer自动生成的单元)

第三步:编写客户调用程序,原代码如下:

procedure TForm1.Button1Click(Sender: TObject);

var

testobj:IWebTest;//定义对象

begin

testobj:=GetIWebTest;//创建对象

showmessage(testobj.gettext);//调用方法

end;