【轉】Delphi調用webservice總結

來源:互聯網
上載者:User

標籤:

原文:http://www.cnblogs.com/zhangzhifeng/archive/2013/08/15/3259084.html

 

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有很多麻煩

【轉】Delphi調用webservice總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.