環境需求
- 安裝 MS SOAP Toolkit 3.0 (含
mssoap30.dll, msxml4.dll)。
- 專案設定:
#import 兩個 DLL,排除衝突型別。
用戶端完整程式碼
#include
#import "msxml4.dll"
using namespace MSXML2;
#import "C:\\Program Files\\Common Files\\MSSoap\\Binaries\\mssoap30.dll" \
exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME") \
rename_namespace("MSSOAPLib30")
using namespace MSSOAPLib30;
void CallWebService()
{
// 1. 建立連接器
ISoapConnectorPtr pConn;
pConn.CreateInstance(__uuidof(HttpConnector30));
pConn->Property["EndPointURL"] = _T("https://localhost/05_server_sample.php");
pConn->Property["SoapAction"] = _T("https://localhost/Reciproke");
pConn->Connect();
pConn->BeginMessage();
// 2. 建立序列化器並掛接輸入串流
ISoapSerializerPtr pSer;
pSer.CreateInstance(__uuidof(SoapSerializer30));
pSer->Init(_variant_t((IUnknown*)pConn->InputStream));
// 3. 組裝 SOAP 訊息
pSer->StartEnvelope("", "", "");
pSer->StartBody("");
pSer->StartElement(_T("Reciproke"), _T("https://webservice.teserco.de/PHPug/"), "", "");
pSer->StartElement(_T("ReciprokeRequest"), "", "", "");
pSer->WriteString(_T("1000000")); // 參數值
pSer->EndElement(); // ReciprokeRequest
pSer->EndElement(); // Reciproke
pSer->EndBody();
pSer->EndEnvelope();
// 4. 發送並接收回應
pConn->EndMessage();
ISoapReaderPtr pReader;
pReader.CreateInstance(__uuidof(SoapReader30));
pReader->Load(_variant_t((IUnknown*)pConn->OutputStream), _T(""));
printf("Answer: %s\n", (const char*)pReader->RpcResult->text);
}
int main()
{
CoInitialize(NULL);
CallWebService();
CoUninitialize();
return 0;
}
PHP 伺服器端範例 (05_server_sample.php)
configureWSDL('PHPugSample5', 'https://webservice.teserco.de/PHPug/');
$server->wsdl->schemaTargetNamespace = 'https://webservice.teserco.de/PHPug';
$server->register('Reciproke',
array('income' => 'xsd:float'),
array('return' => 'xsd:float'),
'https://webservice.teserco.de/PHPug/',
'https://localhost/Reciproke',
'rpc', 'encoded', 'Reciproke Doc');
function Reciproke($value)
{
if ($value == 0)
return new soap_fault('Server', 'Actor 1', 'Division by Zero', 'Error 7');
return 1 / $value;
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
關鍵類別職責
| 介面 | 職責 |
HttpConnector30 | HTTP 傳輸層:連線、送收、設定 EndPointURL/SoapAction |
SoapSerializer30 | 將參數序列化為 SOAP Envelope/Body/Element XML 結構 |
SoapReader30 | 解析回應 XML,提供 RpcResult 直接存取傳回值 |
常見問題
- 編譯錯誤:型別重複定義 →
#import 使用 exclude 排除 msxml 與 mssoap 共同定義的介面。
- 執行時錯誤:WSE 驗證失敗 → 確認伺服器端
SoapAction 與用戶端完全一致 (區分大小寫)。
- 中文參數亂碼 → 確保 PHP 檔案儲存為 UTF-8,SOAP 訊息標頭宣告
encoding="UTF-8"。