標籤:
原文: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會詢問你是否建立介面單元,選擇是,然後輸入介面的名字,我們輸入Main,Delphi將自動建立介面單元(名字為你輸入的介面名+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就算髮布成功了,如果IIS是6.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,如後提示輸入網址,我們輸入剛才複製的網址,點擊next,finish,此時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總結