(DELPHI7)
服务端:
步骤1: File>New>Other>New(选项)>WebServer Application
步骤2: 将新生成TWebModule页面命名为SOAP,单元保存为uMain.pas,工程保存为:SOAP_Server.dpr 。
步骤3:往SOAP页面放三个控件
HTTPSoapDispatcher1: THTTPSoapDispatcher;
HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
WSDLHTMLPublish1: TWSDLHTMLPublish;
将 HTTPSoapDispatcher1.Dispatcher:= HTTPSoapPascalInvoker1 ;
步骤4:编写接口,可直接在uMain.pas单元编写,也可在其它单元编写。此处只定义一个接口,名字为:IGetServer,方法名为: GetServerName
定义:
type
IGetServer = interface(iinvokable)
['{ACF7DE43-3AAC-4BE2-8A03-456AF55EE8ED}']
function GetServerName():string;stdcall;
end;
TIGetServer = class(TInvokableClass, IGetServer)
function GetServerName():string;stdcall;
end;
实现:
function TIGetServer.GetServerName():string;stdcall;
begin
Result := 'this is a test SOAP SERVER';
end;
步骤5:选中SOAP,单击Actions生成一个Action,并命名为:DefaultHandler,onAction代码为:
procedure TSOAP.SOAPDefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
end;
步骤6:在单元后面加上注册接口:
initialization;
InvRegistry.RegisterInterface(TypeInfo(IGetServer));
InvRegistry.RegisterInvokableClass(TIGetServer);
步骤7:编译生成dll,此工程生成的DLL为SOAP_Server.dll
步骤8:部署WEB服务,将生成的 SOAP_Server.dll放到IIS的根目录下,即 C:/Inetpub/wwwroot
步骤9:设置执行权限:开始>控件面板>管理工具>Internet信息服务>默认网站,右键>属性>主目录>执行权限,选【脚本和可执行文件】 >应用
客户端:
步骤1:新建一工程。单元保存为uMain.pas,工程保存为:SOAP_Client.dpr
步骤2:定义一个与服务端一样的接口,接口GUID要重新生成,同样需要注册接口;
步骤3:定义一个取数据的函数
步骤4:调用该函数取回数据。
完整代码如下所示 :
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, InvokeRegistry, Rio, SOAPHTTPClient;
type
IGetServer = interface(iinvokable)
['{58CB7B95-4FA2-4555-9886-81B093419F1C}']
function GetServerName():string;stdcall;
end;
function GetIGetServer(UseWSDL :Boolean=system.False; Addr :string=''):IGetServer;
type
TForm1 = class(TForm)
edt_Result: TEdit;
btn_GetServerData: TButton;
HTTPRIO1: THTTPRIO;
procedure btn_GetServerDataClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetIGetServer(UseWSDL :Boolean=system.False; Addr :string=''):IGetServer;
const
defWSDL = 'http://localhost/SOAP_Server.dll/wsdl/IGetServer';
defURL = 'http://localhost/SOAP_Server.dll/soap/IGetServer';
defSvc = 'IGetServerservice';
defPrt = 'IGetServerPort';
var
RIO :THTTPRIO;
begin
Result := nil;
if Addr = '' then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
RIO := THTTPRIO.Create(nil);
try
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end
else
RIO.URL := Addr;
Result := (RIO as IGetServer);
finally
if Result = nil then
RIO.Free;
end;
end;
procedure TForm1.btn_GetServerDataClick(Sender: TObject);
var
_IGetServer :IGetServer;
begin
_IGetServer := GetIGetServer(false, '');
edt_Result.text := _IGetServer.GetServerName()
end;
initialization
InvRegistry.RegisterInterface(TypeInfo(IGetServer), 'urn:uMain-IGetServer', '');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IGetServer), 'urn:uMain-IGetServer#GetServerName');
end.
发表地:广州