背景:c++通過使用gsoap調用wcf發布的basicHttpBinding服務。
(轉載請注明來源:cnblogs coder-fang)
- 創建WCF服務並啟動,這里不多說,請參考 https://www.cnblogs.com/coder-fang/p/6594964.html ,確定服務接口已發布,瀏覽器可訪問wsdl,如下(我創建的示例服務提供basicHttpBinding 和 netTcpBinding兩種方式):
- 下載gSoap工具,下載地址:http://sourceforge.net/projects/gsoap2 ,解壓至指定目錄,我這里放在 D:\Program Files (x86)\gsoap-2.8
- 進入 D:\Program Files (x86)\gsoap-2.8\gsoap\bin\win32 ,創建 wsmap.dat,文件里輸入: xsd__string = | std::wstring | wchar_t*
- 在此目錄下運行兩個cmd命令:
- 運行如下命令生成 service.h
wsdl2h.exe -s -t wsmap.dat -o service.h http://localhost:9999/?wsdl
- 運行如下命令,生成相關代理類:
soapcpp2.exe -C -I"D:\Program Files (x86)\gsoap-2.8\gsoap\import" -L -i -x -1 service.h
- 此時目錄會多出幾個c++文件:
- 運行如下命令生成 service.h
- 創建C++控制台程序,將以上文件復制到工程中,並同時復制 stdsoap2.h 與 stdsoap2.cpp (在gsoap\import目錄下),使工程包含各文件,同時將工程設置為 不使用預編譯:
- 主函數文件代碼如下:
// C_Client.cpp: 定義控制台應用程序的入口點。 // #include "stdafx.h" #include <stdlib.h> #include <iostream> #include "soapBasicHttpBinding_USCOREIServiceProxy.h" #include "BasicHttpBinding_USCOREIService.nsmap" #pragma warning(disable : 4996) std::string WString2String(const std::wstring& ws) { std::string strLocale = setlocale(LC_ALL, ""); const wchar_t* wchSrc = ws.c_str(); size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1; char *chDest = new char[nDestSize]; memset(chDest, 0, nDestSize); wcstombs(chDest, wchSrc, nDestSize); std::string strResult = chDest; delete[]chDest; setlocale(LC_ALL, strLocale.c_str()); return strResult; } // string => wstring std::wstring String2WString(const std::string& s) { std::string strLocale = setlocale(LC_ALL, ""); const char* chSrc = s.c_str(); size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1; wchar_t* wchDest = new wchar_t[nDestSize]; wmemset(wchDest, 0, nDestSize); mbstowcs(wchDest, chSrc, nDestSize); std::wstring wstrResult = wchDest; delete[]wchDest; setlocale(LC_ALL, strLocale.c_str()); return wstrResult; } int main() { const char* addr = "http://localhost:9999/Service"; BasicHttpBinding_USCOREIServiceProxy proxy(addr, SOAP_C_UTFSTRING); _ns1__GetUsersResponse rsp; _ns1__GetUsers getData; wchar_t start[] = L"z";//返回以 z 開頭的名稱 getData.startWith = start; if (proxy.GetUsers(&getData, rsp) == SOAP_OK) { for (int i = 0; i < rsp.GetUsersResult->__sizestring; i++) { printf("%s \n", WString2String(*rsp.GetUsersResult->string++).c_str()); } } else { proxy.soap_stream_fault(std::cerr); } proxy.destroy(); return 0; }
- 運行效果:
- 目前只試過使用http綁定模式,tcp綁定暫時未通過,正在嘗試中。