Delphi調用webservice總結


Delphi調用C#寫的webservice

 

用delphi的THTTPRIO控件調用了c#寫的webservice。

下面是我調試時遇到的一些問題:

1:導入wsdl文件:file--new----other----webservice---WSDLimporter---輸入wsdl地址:如下:http://127.0.0.1/ WebService/WebServiceCall.asmx?wsdl

注意末尾的:'?wsdl'不能少。要不可能會說找不到。

2:設置THTTPRIO控件的屬性:

http:// 127.0.0.1 /WebService/WebServiceCall.asmx?wsdl賦給URL屬性,而不是賦給wsdlLocation屬性。

3:傳遞參數是web服務端總為空:

在導入的接口單元的聲明部分添加如下代碼:

InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap),ioDocument);//其中紅色部分為導入接口名稱。

 

在IIS中配置C#寫的webservice,有時候會出現如下的錯誤:

--------------------------------------------------------
分析器錯誤消息: 在應用程序級別之外使用注冊為 allowDefinition='MachineToApplication' 的節是錯誤的。如果在 IIS中沒有將虛擬目錄配置為應用程序,則可能導致此錯誤。
源錯誤: 
安全身份驗證模式。 
-->
<authentication mode="Windows"/>
<!--
如果在執行請求的過程中出現未處理的錯誤
------------------------------------------------------------------------------
解決方法:
在要發布的虛擬目錄中的創建一個應用程序。步驟

你的站點 --> 選中你要發布的虛擬目錄 --> 右鍵單擊 --> 屬性 --> 目錄(選項卡) --> 應用程序名 --> 創建  --> 確定。

然后再重新訪問頁面,應該就OK了。

Delphi 7 建立測試程序

1、新建一個應用程序: 
2、拖一個button一個edit和一個HTTPRIO(在webservices頁上)到窗體上; 
3、接下來: 
File-> new-> other-> webservices-> WSDL   importer 
輸入wsdl文件地址,點擊next   導入 
保存unit   Service1 
4、在unit1(form1   的單元文件)中引用Service1 
5、 HTTPRIO1的 URL屬性設置為 'http://localhost/WebService1/Service1.asmx?WSDL ' 

6、添加form1   的代碼如下: 

unit   Unit1;   

interface 

uses 
    Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms, 
    Dialogs,   StdCtrls,   InvokeRegistry,   Rio,   SOAPHTTPClient;   
type 
    TForm1   =   class(TForm) 
        Button1:   TButton; 
        Edit1:   TEdit; 
        HTTPRIO1:   THTTPRIO; 
        procedure   Button1Click(Sender:   TObject); 
    private 
        {   Private   declarations   } 
    public 
        {   Public   declarations   } 
    end; 
var 
    Form1:   TForm1; 
implementation 
uses 
    Service1;

{$R   *.dfm} 
procedure   TForm1.Button1Click(Sender:   TObject); 
begin 
    Edit1.Text:=(HTTPRIO1   as   Service1Soap).HelloWorld; 
end; 
end. 

如果有時候測試發現,還是不行.......可能有下面的問題,

在用VS2005寫的WebService的類屬性中加入SoapRpcServiceAttribute屬性就可以了。
 :
  [SoapRpcService(RoutingStyle=SoapServiceRoutingStyle.SoapAction)]

 

 

Delphi開發和調用的webservice

下面說明如何編寫用於IIS發布的ISAPI類型的WebService

1 New|Other|WebServices|SOAP Server Application|這里先選擇建立Web App Debugger類型的WebService,因為這種類型的WebService便於調試,當我們調試好它,准備發布時再將此類型轉換為ISAPI類型。

2 選擇Web App Debugger后,隨便輸入一個ClassName,這里我們輸入“Test

3 隨后Delphi會詢問你是否建立接口單元,選擇是,然后輸入接口的名字,我們輸入MainDelphi將自動建立接口單元(名字為你輸入的接口名+Intf結束,即MainIntf)和實現接口的單元(名字為你輸入的接口名+Impl,即MainImpl)。到此一個空的WebService已建立好。

4 接下來我們將編寫供別人調用的WebService函數。在此我們編寫一個簡單的例子。打開接口單元(MainIntf),在Type后,接口聲明后添加接口函數

function GetMsg(AMsg: string): String; stdcall;”,函數后面必須加上“stdcall”。

   如圖:

 

 

 

 

5、接口函數的聲明已經完成,下面就是要實現這個函數了。打開接口實現單元(MainImpl),

   public中寫上該函數的聲明,在implement后寫該函數的實現。如圖:

 

 

 

 

6、到此,WebService已經撰寫完畢。接下來是調試。在我們新建的時候,Delphi已經為我們   建立了一個Unit1和其窗體,在Unit1中引用接口單元(MainImpl),然后在窗體中加一個   按鈕,在按鈕的單擊事件中調用剛才寫的WebService函數就可以調試了,代碼如圖:

 

 

 

 

或者使用THTTPRIO控件

 

 

 

 

 

7、調試成功后就可以轉類型了,將Web App Debugger類型轉換為ISAPI類型其實很簡單,我們先重新建一個ISAPI類型的WebService項目,依次選擇New|Other|WebServices|SOAP Server Application|ISPA/…,提示是否創建接口時選擇“是”,然后輸入和剛才一樣的接口名,接着保存好,然后將調試成功的Web App Debugger類型的WebService項目中的接口單元和接口實現單元復制替換掉剛剛創建的ISAPI類型項目中的接口單元和接口實現單元,然后打開ISAPI類型的WebService,編譯生成dll。至此ISAPI類型的WebService建立成功。

8、將ISAPI類型的WebService發布到IIS上。在IIS中新建站點,新建時將執行權限設置成“腳本和可執行文件”,將WebService整個項目拷貝到站點文件夾下,啟動站點,該WebService就算發布成功了,如果IIS6.0以上的注意在Web服務擴展中將“所有未知ISAPI擴展”設置為允許,

   具體設置可參見IIS幫助文檔。如圖:

 

 

 

 

 

9、如何用Delphi調用剛才寫的WebService。在瀏覽器中輸入剛才站點的路徑,如:  http://127.0.0.1/project2.dll,瀏覽器轉到項目所在文件夾,如圖:

 

 

 

 

打開如下圖所示的的dll描述頁面,該dll中有一個個接口函數GetMsg,它們都是供別人調用的接口函數。點擊WSDL打開WSDL描述頁面,此時復制該頁面的網址http://127.0.0.1/project2.dll/wsdl/IMain,這個網址是我們要用到的。

 

10 得到網址后,新建一個Application,我們就在這個Application中調用剛才的WebService。依次點擊New|Other|WebServices|WSDL Import,如后提示輸入網址,我們輸入剛才復制的網址,點擊nextfinish,此時Delphi將自動添加一個單元,該單元就是調用WebService的單元,有了這個單元我們就可以調用WebService了。在Unit1中引用該單元,再添加一個按鈕,在按鈕的單擊事件中聲明一個接口對象,然后調用自動生成單元中的GetMainIntf(該方法是自動生成的)函數給這個接口對象賦值,然后就可以用這個接口對象調用接口函數了。

 

注意:如果前台使用THTTPRIO控件來連接,

http://127.0.0.1/project2.dll/wsdl/IMain賦給wsdlLocation屬性,而不是賦給URL屬性。這點和調用C#不一樣

 

Delphi調用JAVA寫的webservice

Java寫服務端的webservice

開發環境

MyEclipse 6.5 + jdk6.0 +tomcat 6.0 + axis2

 

具體的開發步驟不講,網上都有,只將碰到的幾個問題說下:

1、             安裝axis2的插件,我使用時網上最新版本是1.6.1,下載下面兩個插件

Service Archive Wizard - Eclipse Plug-in

Code Generator Wizard - Eclipse Plug-in

安裝網上方法直接拷貝到plugins目錄,在MyEclipse中new---->other並沒有出現如下的界面

 

網上也沒有找到方法,后來找了下面的版本,就是

Axis2_Codegen_Wizard_1.3.0

Axis2_Service_Archiver_1.3.0

直接拷貝到plugins目錄下就可以;

分析:估計是MyEclipse版本中的Eclpise版本低了,裝不上高版本的1.6.1,反正低版本也好用;

 

2、在MyEclipse,開發的時候,如果用Axis2 Service Archiver生成服務的話,需要把項目屬性中的java Compiler--->Compiler compliance level:改為5.0,我的都是默認6.0;

要不然最后load不出class中的方法;

 

3、如需要一些jar文件,比如連接數據庫相關的jar,發布到tomcat中時候,需要把這些文件拷貝到webapps\axis2\WEB-INF\lib下;

 

4、使用Delphi 7調用axis2寫的webservice,導入wsdl的時候,沒有接口說明,可能是delphi的版本太低了,所以使用了delphi 2010導入生成了接口文件,然后用到了delphi 7中也可以;

 

5設置THTTPRIO控件的屬性,應把wsdl賦給URL屬性,和調c#一樣

 

建議用高版本的開發webservice,如2007,2010等,delphi 7有很多麻煩


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM