首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC 6.0 使用 MS SOAP Toolkit 3.0 呼叫 Web Service:SOAP 序列化與 HTTP 連接器實作

     編輯:VC 教學

環境需求

  • 安裝 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);
?>

關鍵類別職責

介面職責
HttpConnector30HTTP 傳輸層:連線、送收、設定 EndPointURL/SoapAction
SoapSerializer30將參數序列化為 SOAP Envelope/Body/Element XML 結構
SoapReader30解析回應 XML,提供 RpcResult 直接存取傳回值

常見問題

  • 編譯錯誤:型別重複定義 → #import 使用 exclude 排除 msxml 與 mssoap 共同定義的介面。
  • 執行時錯誤:WSE 驗證失敗 → 確認伺服器端 SoapAction 與用戶端完全一致 (區分大小寫)。
  • 中文參數亂碼 → 確保 PHP 檔案儲存為 UTF-8,SOAP 訊息標頭宣告 encoding="UTF-8"。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved