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