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.
B.调用ASMX,定位WSDL文件位置
- 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;
D.注意SOAP控件的设置
USEUTF8要设为TRUE,否则为乱码。
完成以上步骤,WebService就可以调用成功了.对于复杂的数据要结合XmlDocument一起使用.