Delphi调用.NET的WebService,是非常容易和方便的,下面用C#提供的
Login服务 ,来说明Delphi的调用方法.Login返回的是一个字符串.
一般有以下布骤:
A.调用第一步,完成C#,asmx文件生的调用函数
- unit UnitMJWebLogin;
- interface
- uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
- type
- // Namespace : http://tempuri.org/
- // soapAction: http://tempuri.org/%operationName%
- // transport : http://schemas.xmlsoap.org/soap/http
- // style : document
- // binding : MJLoginSoap
- // service : MJLogin
- // port : MJLoginSoap
- // URL : http://127.0.0.1/EPlatform/bin/MJLogin/MJLogin.asmx
- // ************************************************************************ //
- IMJWebLogin = interface (IInvokable)
- [ '{EEAFD61D-DA43-1CB6-C349-E5DD8110DE17}' ]
- function Login( const aLoginName: WideString; const aPassword: WideString; const aCPUID: WideString; const aHardDiskID: WideString): string ; stdcall;
- {根据ASMX生成的函数}
- end ;
- function GetMJLoginSoap(UseWSDL: Boolean=System . False; Addr: string = '' ; HTTPRIO: THTTPRIO = nil ): IMJWebLogin;
- implementation
- uses
- UnitCommon ;
- function GetMJLoginSoap(UseWSDL: Boolean; Addr: string ; HTTPRIO: THTTPRIO): IMJWebLogin;
- const
- defWSDL = 'http://127.0.0.1/EPlatform/wsdl/Login.wsdl' ;
- defURL = 'http://127.0.0.1/EPlatform/MJLogin/MJLogin.asmx' ;
- defSvc = 'MJLogin' ;
- defPrt = 'MJLoginSoap' ;
- var
- RIO: THTTPRIO;
- begin
- Result := nil ;
- if (Addr = '' ) then
- begin
- if UseWSDL then
- Addr := defWSDL
- else
- Addr := defURL;
- end ;
- if HTTPRIO = nil then
- RIO := THTTPRIO . Create( nil )
- else
- RIO := HTTPRIO;
- try
- Result := (RIO as IMJWebLogin);
- if UseWSDL then
- begin
- RIO . WSDLLocation := Addr;
- RIO . Service := defSvc;
- RIO . Port := defPrt;
- end else
- RIO . URL := Addr;
- finally
- if (Result = nil ) and (HTTPRIO = nil ) then
- RIO . Free;
- end ;
- end ;
- initialization
- InvRegistry . RegisterInterface(TypeInfo(IMJWebLogin), 'http://tempuri.org/' , 'GB2312' );
- InvRegistry . RegisterDefaultSOAPAction(TypeInfo(IMJWebLogin), 'http://tempuri.org/%operationName%' );
- InvRegistry . RegisterInvokeOptions(TypeInfo(IMJWebLogin), ioDocument);
- end .
unit UnitMJWebLogin; interface uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns; type // Namespace : http://tempuri.org/ // soapAction: http://tempuri.org/%operationName% // transport : http://schemas.xmlsoap.org/soap/http // style : document // binding : MJLoginSoap // service : MJLogin // port : MJLoginSoap // URL : http://127.0.0.1/EPlatform/bin/MJLogin/MJLogin.asmx // ************************************************************************ // IMJWebLogin = interface(IInvokable) ['{EEAFD61D-DA43-1CB6-C349-E5DD8110DE17}'] function Login(const aLoginName: WideString; const aPassword: WideString; const aCPUID: WideString; const aHardDiskID: WideString): string; stdcall; {根据ASMX生成的函数} end; function GetMJLoginSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IMJWebLogin; implementation uses UnitCommon ; function GetMJLoginSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IMJWebLogin; const defWSDL = 'http://127.0.0.1/EPlatform/wsdl/Login.wsdl'; defURL = 'http://127.0.0.1/EPlatform/MJLogin/MJLogin.asmx'; defSvc = 'MJLogin'; defPrt = 'MJLoginSoap'; var RIO: THTTPRIO; begin Result := nil; if (Addr = '') then begin if UseWSDL then Addr := defWSDL else Addr := defURL; end; if HTTPRIO = nil then RIO := THTTPRIO.Create(nil) else RIO := HTTPRIO; try Result := (RIO as IMJWebLogin); if UseWSDL then begin RIO.WSDLLocation := Addr; RIO.Service := defSvc; RIO.Port := defPrt; end else RIO.URL := Addr; finally if (Result = nil) and (HTTPRIO = nil) then RIO.Free; end; end; initialization InvRegistry.RegisterInterface(TypeInfo(IMJWebLogin), 'http://tempuri.org/', 'GB2312'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IMJWebLogin), 'http://tempuri.org/%operationName%'); InvRegistry.RegisterInvokeOptions(TypeInfo(IMJWebLogin), ioDocument); end.
B.调用ASMX,定位WSDL文件位置
- procedure TFrm_Login . SetSoapConnection;
- begin
- self . HTTPRIO_Login . WSDLLocation := 'HTTP://127.0.0.1/EPlatform/wsdl/Login.wsdl' ;
- end ;
procedure TFrm_Login.SetSoapConnection; begin self.HTTPRIO_Login.WSDLLocation := 'HTTP://127.0.0.1/EPlatform/wsdl/Login.wsdl'; end;
C.调用第三步,完成登录事件的编写
- procedure TFrm_Login . Btn_SureClick(Sender: TObject);
- var
- HttpCallResult : string ;
- begin
- self . SetSoapConnection;
- try
- HttpCallResult :=
- (self . HTTPRIO_Login as IMJWebLogin).Login(Trim(self . ComboBox_LoginName . Text),
- Trim(self . Edit_Password . Text),
- Trim(self . FUser . FCPUID),Trim(self . FUser . FHardDiskID)) ;
- except
- showmessage( '目前服务器忙,请稍候连接服务器' );
- exit ;
- end ;
- if HttpCallResult= '密码错误' then begin
- showmessage (HttpCallResult);
- self . Edit_Password . SelectAll;
- self . Edit_Password . SetFocus;
- exit;
- end ;
- end ;
procedure TFrm_Login.Btn_SureClick(Sender: TObject); var HttpCallResult : string ; begin self.SetSoapConnection; try HttpCallResult := (self.HTTPRIO_Login as IMJWebLogin).Login(Trim(self.ComboBox_LoginName.Text), Trim(self.Edit_Password.Text), Trim(self.FUser.FCPUID),Trim(self.FUser.FHardDiskID)) ; except showmessage('目前服务器忙,请稍候连接服务器'); exit ; end ; if HttpCallResult='密码错误' then begin showmessage (HttpCallResult); self.Edit_Password.SelectAll; self.Edit_Password.SetFocus; exit; end ; end;
D.注意SOAP控件的设置
USEUTF8要设为TRUE,否则为乱码。
完成以上步骤,WebService就可以调用成功了.对于复杂的数据要结合XmlDocument一起使用.