Delphi与WebService

大家都知道C# Webservice技术的出现将各种开发技术和语言完全的融合了,下面就这种融合在C#和delphi之间的交互做一次全面的体现,前者是目前最好的开发平台,后者依然是小型c/s系统的最佳选择.

1.使用C#创建一个Webservice服务。

使用vs2005的模板创建C# Webservice非常容易。原文件如下:

 
 
  1. [WebService(Namespace = \"http:  
  2. //localhost/webserver/\")]   
  3. [WebServiceBinding(ConformsTo =   
  4. WsiProfiles.BasicProfile1_1)]   
  5.     
  6. public class Service :   
  7. System.Web.Services.WebService   
  8. {   
  9. public Service () {   
  10. //如果使用设计的组件,请取消注释以下行    
  11. InitializeComponent();   
  12. }   
  13.    
  14. #region  Component  Designer    
  15. generated  code   
  16. private void InitializeComponent()   
  17. {   
  18.     
  19. }   
  20. //Web  服务设计器所必需的    
  21. private IContainer components = null;   
  22.  
  23. protected override void Dispose  
  24. (bool disposing)   
  25. {   
  26. if (disposing && components != null)   
  27. {   
  28. components.Dispose();   
  29. }   
  30. base.Dispose(disposing);   
  31. }   
  32. #endregion   
  33. //这个是自动生成的一个webservice函数,  
  34. 可以不要。   
  35. [WebMethod]   
  36. public string HelloWorld() {   
  37. return \"Hello World\";   
  38. }   
  39. //这个才是我们自己创建的,   
  40. [WebMethod]     
  41. public int addnumber(int a, int b)   
  42. {   
  43. return = a + b;   
  44. }   

2.使用delphi创建一个dll(非com的dll),该dll调用上面的webserivce服务。

使用delphi调用C#的webservice过程也很容易,但是对于新手可能比较麻烦(我就是这么过来的)

第一步:创建一个dll单元:

 
 
  1. {$R *.res}   
  2. function GetNum(a,b:integer):  
  3. integer stdcall; [Page]  
  4. var   
  5. ireturn :Integer;   
  6. begin   
  7. ireturn:=GetServiceSoap().addnumber(a,b);   
  8. //这个GetServiceSoap是什么,看后面...   
  9. result:=ireturn;   
  10. end;  
  11. exports   
  12. GetNum name ’GetNum’;   
  13. begin   
  14. end.   
  15. //如果是delphi调用该dll必须使用下面的代码。  
  16. C#调用则不需要了(C#还是要牛一些,呵呵)   
  17. initialization   
  18. coinitialize(nil);   
  19. finalization   
  20. counInitializ   
  21. 第二步:将webserivce的WSDL导入到该dll工程中,  
  22. 如何导,方法至少有两种,我说简单的一种:   
  23. file->new->other->WebService->WSDL Importer,  
  24. (将C#的WSDL输入)然后delphi会自动给你生成了一个pas文件,   
  25. function GetServiceSoap(UseWSDL: Boolean;   
  26. Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;   
  27. const   
  28. defWSDL = ’http://localhost/webserver/  
  29. Service.asmx?WSDL’;   
  30. defURL= ’http://localhost/webserver/  
  31. Service.asmx’;   
  32. defSvc= ’Service’;   
  33. defPrt= ’ServiceSoap’;   
  34. var   
  35. RIO: THTTPRIO;   
  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. if HTTPRIO = nil then   
  46. RIO := THTTPRIO.Create(nil)   
  47. else   
  48. RIO := HTTPRIO;   
  49. try   
  50. //RIO.HTTPWebNode.UseUTF8InHeader:=  
  51. True; //在此添加一句,修改编码方案。   
  52. Result := (RIO as ServiceSoap);   
  53. if UseWSDL then   
  54. begin   
  55. RIO.WSDLLocation := Addr;   
  56. RIO.Service := defSvc;  
  57. RIO.Port := defPrt;   
  58. end else   
  59. RIO.URL := Addr;   
  60. finally   
  61. if (Result = nil) and   
  62. (HTTPRIO = nil) then   
  63. RIO.Free;   
  64. end;   
  65. end;   
  66.  
  67. initialization   
  68. InvRegistry.RegisterInterface  
  69. (TypeInfo(ServiceSoap), ’  
  70. http://localhost/webserver/’, ’  
  71. utf-8’); [Page]  
  72. InvRegistry.RegisterDefaultSOAPAction  
  73. (TypeInfo(ServiceSoap), ’  
  74. http://localhost/webserver/%operationName%’);   
  75. //对于无法识别传入的参数的问题,需要手工加上这一句>......   
  76. InvRegistry.RegisterInvokeOptions(TypeInfo  
  77. (ServiceSoap), ioDocument);   
  78.    
  79. 这段代码基本上你不用关心,但是,有两个地方需要特别注意:   
  80. 1.RIO.HTTPWebNode.UseUTF8InHeader:=True;  
  81. 对于中文参数必须加上   
  82. 2.InvRegistry.RegisterInvokeOptions  
  83. (TypeInfo(ServiceSoap), ioDocument);  

如果传入的参数不能被webservice识别时,多半是因为你没有加上这一句。

3.使用delphi调用上面的dll 就一个函数,没有什么好说的:

 
 
  1. procedure TForm1.Button1Click(Sender: TObject);   
  2. type   
  3. GetNumTotal=function(a,b:integer):integer;stdcall;   
  4. var   
  5. Th:Thandle;   
  6. Tf:GetNumTotal;   
  7. Tp:TFarProc;   
  8. begin   
  9.  Th:=LoadLibrary(’mywebservice.dll’); {装载DLL}   
  10. if Th〉0 then   
  11. try   
  12. Tp:=GetProcAddress(Th,PChar(’GetNum’));   
  13. if Tp〈 〉nil   
  14. then begin   
  15. Tf:=GetNumTotal(Tp);   
  16. Edit1.Text:=IntToStr(Tf(1,3)); {调用GetNumTotal函数}   
  17. end   
  18. else   
  19. ShowMessage(’GetNumTotal函数没有找到’);   
  20. finally   
  21. FreeLibrary(Th); {释放DLL}   
  22. end   
  23. else   
  24. ShowMessage(’mywebservice.dll没有找到’);   
  25. end;   

4.使用C#调用上面的dll

 
 
  1. [DllImport(\"mywebservice.dll\",  
  2. EntryPoint=\"GetNum\")]  
  3. publicstaticexternintGetNum  
  4. (inta,intb);  
  5. privatevoidbutton1_Click  
  6. (objectsender,EventArgse)  
  7. {  
  8. inta,b,i;  
  9. a=10;  
  10. b=20;  
  11. i=GetNum(a,b);//第一次比较慢  
  12. (webserivce的唯一弊端!!!!)  
  13. textBox1.Text=i.ToString();  
  14. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种编程语言,可以用来开发各种类型的应用程序,包括调用Web服务。在Delphi中调用Web服务,可以使用Delphi内置的SOAP组件来实现。 首先,需要在Delphi中创建一个新的SOAP客户端。打开Delphi开发环境,选择"文件" -> "新建" -> "其他" -> "SOAP客户端应用程序"来创建一个新的SOAP客户端项目。 在新建的SOAP客户端项目中,可以在"工具"菜单下找到"导入WSDL..."选项。通过选择该选项并选择要调用的Web服务的WSDL文件,可以自动生成相应的接口和实现代码。 在生成的代码中,可以看到WebService组件的初始化代码、接口定义和具体的方法实现。根据WebService的要求,可以在接口定义中添加需要的输入参数和返回值,并在方法实现中编写相应的业务逻辑。可以调用WebService的方法来实现与Web服务的交互。 接下来,可以根据自己的需求调用WebService的方法。可以在程序的适当位置,通过创建WebService组件对象并调用相应的方法来实现对Web服务的调用。可以传递参数给Web服务,并获取返回的结果。 在调用WebService的方法之前,需要确保已经建立了与Web服务的连接。可以调用WebService组件的Connect方法来建立连接,调用Disconnect方法来断开连接。 在调用WebService的过程中,还可以处理异常,以确保程序在发生错误时能够正常处理。可以使用try...except块来捕获并处理异常,通过处理异常可以提示用户发生了什么错误,并采取相应的措施。 总结而言,通过使用Delphi的SOAP组件,可以方便地实现对Web服务的调用。在创建SOAP客户端项目、生成接口和方法实现代码后,可以根据需要调用WebService的方法,传递参数并获取返回值。同时,还需要处理异常,以确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值