Delphi 调用.NET(C#) Web Service

这篇博客介绍了如何在Delphi中调用C#编写的.NET Web Service,通过创建THTTPRIO实例,设置WSDL定位,并提供了登录事件的示例代码,详细阐述了调用过程中的关键步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Delphi调用.NET的WebService,是非常容易和方便的,下面用C#提供的

Login服务 ,来说明Delphi的调用方法.Login返回的是一个字符串.

一般有以下布骤:

A.调用第一步,完成C#,asmx文件生的调用函数

  1. unit UnitMJWebLogin;

  2. interface  

  3. uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
  4.   
  5. type   
  6.    // Namespace : http://tempuri.org/ 
  7.    // soapAction: http://tempuri.org/%operationName%
  8.    // transport : http://schemas.xmlsoap.org/soap/http  
  9.    // style      : document   
  10.    // binding    : MJLoginSoap 
  11.    // service    : MJLogin   
  12.    // port       : MJLoginSoap   
  13.    // URL        : http://127.0.0.1/EPlatform/bin/MJLogin/MJLogin.asmx 
  14.    // ************************************************************************ //   
  15.    IMJWebLogin = interface (IInvokable)   
  16.    [ '{EEAFD61D-DA43-1CB6-C349-E5DD8110DE17}' ]  
  17.     function    Login( const aLoginName: WideString; const aPassword: WideString; const aCPUID: WideString; const aHardDiskID: WideString): string ; stdcall;  
  18. {根据ASMX生成的函数}   
  19.    end ;   
  20. function GetMJLoginSoap(UseWSDL: Boolean=System . False; Addr: string = '' ; HTTPRIO: THTTPRIO = nil ): IMJWebLogin;

  21. implementation   
  22.   
  23. uses   
  24.     UnitCommon ;   

  25. function GetMJLoginSoap(UseWSDL: Boolean; Addr: string ; HTTPRIO: THTTPRIO): IMJWebLogin;   
  26.   
  27. const   
  28.    defWSDL = 'http://127.0.0.1/EPlatform/wsdl/Login.wsdl' ;   
  29.    defURL   = 'http://127.0.0.1/EPlatform/MJLogin/MJLogin.asmx' ;   
  30.    defSvc   = 'MJLogin' ;   
  31.    defPrt   = 'MJLoginSoap' ;   
  32.   
  33. var   
  34.    RIO: THTTPRIO;   
  35.   
  36. begin   
  37.    Result := nil ;  
  38.    if (Addr = '' ) then   
  39.    begin   
  40.      if UseWSDL then   
  41.        Addr := defWSDL   
  42.      else   
  43.        Addr := defURL;   
  44.    end ;   
  45.   
  46.    if HTTPRIO = nil then   
  47.      RIO := THTTPRIO . Create( nil )  
  48.    else   
  49.      RIO := HTTPRIO;   
  50.    try   
  51.      Result := (RIO as IMJWebLogin);  
  52.      if UseWSDL then   
  53.      begin   
  54.        RIO . WSDLLocation := Addr;  
  55.        RIO . Service := defSvc;   
  56.        RIO . Port := defPrt;  
  57.      end else   
  58.        RIO . URL := Addr;   
  59.    finally   
  60.      if (Result = nil ) and (HTTPRIO = nil ) then   
  61.        RIO . Free;   
  62.    end ;   
  63. end ;   
  64.   
  65.   
  66.   
  67.   
  68.   
  69. initialization   
  70.    InvRegistry . RegisterInterface(TypeInfo(IMJWebLogin), 'http://tempuri.org/' , 'GB2312' );   
  71.    InvRegistry . RegisterDefaultSOAPAction(TypeInfo(IMJWebLogin), 'http://tempuri.org/%operationName%' );   
  72.    InvRegistry . RegisterInvokeOptions(TypeInfo(IMJWebLogin), ioDocument);   
  73. 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文件位置

  1. procedure TFrm_Login . SetSoapConnection;   
  2. begin   
  3. self . HTTPRIO_Login . WSDLLocation := 'HTTP://127.0.0.1/EPlatform/wsdl/Login.wsdl' ;   
  4. end ;  

procedure TFrm_Login.SetSoapConnection; begin self.HTTPRIO_Login.WSDLLocation := 'HTTP://127.0.0.1/EPlatform/wsdl/Login.wsdl'; end;

C.调用第三步,完成登录事件的编写

  1. procedure TFrm_Login . Btn_SureClick(Sender: TObject);   
  2. var   
  3.    HttpCallResult : string ;   
  4. begin   
  5.    self . SetSoapConnection;   
  6.    try   
  7.    HttpCallResult :=   
  8.     (self . HTTPRIO_Login as IMJWebLogin).Login(Trim(self . ComboBox_LoginName . Text),   
  9.                                                Trim(self . Edit_Password . Text),   
  10.                                                Trim(self . FUser . FCPUID),Trim(self . FUser . FHardDiskID)) ;   
  11.    except   
  12.      showmessage( '目前服务器忙,请稍候连接服务器' );   
  13.      exit ;   
  14.    end    ;   
  15.    if HttpCallResult= '密码错误' then begin   
  16.       showmessage (HttpCallResult);   
  17.       self . Edit_Password . SelectAll;   
  18.       self . Edit_Password . SetFocus;   
  19.       exit;   
  20.    end ;   
  21. 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控件的设置

SOAP

USEUTF8要设为TRUE,否则为乱码。

完成以上步骤,WebService就可以调用成功了.对于复杂的数据要结合XmlDocument一起使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值