C++ (使用gsoap)調用 WCF服務

背景:c++經過使用gsoap調用wcf發佈的basicHttpBinding服務。html

 (轉載請註明來源:cnblogs coder-fang)ios

 

 

  1. 建立WCF服務並啓動,這裏很少說,請參考 https://www.cnblogs.com/coder-fang/p/6594964.html  ,肯定服務接口已發佈,瀏覽器可訪問wsdl,以下(我建立的示例服務提供basicHttpBinding 和 netTcpBinding兩種方式):

     

  2. 下載gSoap工具,下載地址:http://sourceforge.net/projects/gsoap2   ,解壓至指定目錄,我這裏放在 D:\Program Files (x86)\gsoap-2.8
  3. 進入 D:\Program Files (x86)\gsoap-2.8\gsoap\bin\win32  ,建立 wsmap.dat,文件裏輸入: xsd__string = | std::wstring | wchar_t*
  4. 在此目錄下運行兩個cmd命令:
    1.   運行以下命令生成 service.h
      wsdl2h.exe -s -t wsmap.dat -o service.h http://localhost:9999/?wsdl

    2. 運行以下命令,生成相關代理類:
      soapcpp2.exe -C -I"D:\Program Files (x86)\gsoap-2.8\gsoap\import" -L -i -x -1 service.h

    3. 此時目錄會多出幾個c++文件:

       

  5.   建立C++控制檯程序,將以上文件複製到工程中,並同時複製 stdsoap2.h 與 stdsoap2.cpp (在gsoap\import目錄下),使工程包含各文件,同時將工程設置爲 不使用預編譯:

     

  6. 主函數文件代碼以下:
    // 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;
    }
    View Code

     

     

  7. 運行效果:

     

     

  8. 目前只試過使用http綁定模式,tcp綁定暫時未經過,正在嘗試中。
相關文章
相關標籤/搜索