最近一個專案由「WinForm直接存取DB2」移植到「WinForm透過PHP Web Service來存取DB2」。
(優點是php可以架在Linux上,而Linux是免費的)
這個命題的困難不是存取DB2,而是.NET呼叫PHP的Web Service。對我這個長期作.NET,之前一直以為只有.NET才可以做Web Service…的人來說,真是有點強「聰」所難了。
但是問題還是要解決的,期限就擺在眼前呢。經過一番調查,終於有了眉目,現在分享給大家。
首先要說明的,PHP伺服器需要至少需要兩個檔案-一個WSDL檔案和一個PHP檔案。 WSDL檔案是一種機讀的XML文件,用來描述WebService提供的服務和呼叫方法(對於.NET則可以自動產生呼叫程式碼,十分好用),php檔案就是真正實現的WEB服務了。
1)PHP伺服器端程式碼
1-1)TestWebService.php程式碼
以下為引用的內容:
?類 TestWebService
{
public function Hello()
{
return array( unction GetArray($args )
{
/*
(這十分令人費解,我的理解是,在調用該方法時,系統把所有參數都放到一個對象裡傳過來的)
value1 = $args->value1;
$value2 = $args->value2;//這兩句是取得真正的參數
>
//回傳值也很特別,不是直接回傳$arry,而是把它放到一個物件裡再回傳。
return array("GetArrayResult"=>$arry);
}
//建立WebSevice
}
//建立WebSevice
}
//創建WebSevice
//建立WebSevice
//指定類別名稱
$server->setClass("TestWebService");
$server->handle();
?>
1-2)TestWebService.wsdl程式碼
以下為引用的內容:
元素>
Type>
🎜>
ComplexType> se">
ult" type="tns:ArrayOfString"/>
>
>
:message >
wsdl:dlsage>
訊息>
WSDL的程式碼比較長,當方法很多時,手敲程式碼是不太可能的。有一個巧的辦法,就是也用.NET實作一個不含真正方法體的Web Serivce,然後透過http://***/TestWebService.asmx? wsdl的方法產生wsdl程式碼檔。
關於WSDL文件,我要說明特別說明兩點:
(1)soap:address結點是聲明WebService的位址,部署時要改成對應位址;
(2)一維數組的宣告類型為ArrayOfType,字串陣列為ArrayOfString。如果Type不是簡單類型,則Type需要另外聲明。
2).NET客戶端程式碼
先加入Web引用,位址為WSDL檔案的Http位址。
呼叫程式碼(C#)
以下為引用的內容:
//初始化WebService
> //調式第一個方法
string str = srv.HelloWorld();
string1","string2") ;
(二)PHP Web Service方法的傳入參數、回傳值都至多有一個,因為真正呼叫時的參數和回傳值,都是包裝到一個物件中傳送的。
(三)PHP Web Service也支援自訂類型和自訂類型陣列等複雜類型,但不支援多組數組。
(四)若回傳值需要是多張二維表時,我淺薄的以為,可以傳化一組字串數組傳送,格式為
[表1行數],[表1列數],[表1列名1],[表1列名2],…[表1列名N],[表1中按行列存放的值]
[表2行數],[表2列數],[表2列名1],[表2列名2],…[表2列名N],[表2中依列存放的值]
……
[表M行數],[表M列數],[表M列名1],[表M列名2],…[表M列名N ],[表2中按行列存放的值]
以上就是.NET調PHP Web Service的典型例子的內容,更多相關文章請關注PHP中文網(www.php.cn)!