標籤:
我在網上找了好多的這方面的文章,真正能夠實現出來的幾乎沒有。
只有我在1年前下載並調試成功的案例。那麼GSOAP是比較複雜的實現過程,需要學習的理論知識也比較多,需要深入瞭解的可以到官網上去下載。
那麼調試時借鑒別人的文章是非常有用的,但是一定要看清對方調試工具的版本號碼。
1.1.1.1 環境
l VS2012
l GSOAP 2.8.14 (請使用指定版本)
l WIN7 IIS
1.1.1.2 下載GSOAP程式包 GSOP2.8
1.1.1.3 C#程式建立WCF服務,並部署到IIS中。
public interface IService1
{
//[OperationContract]
//string GetData(int value);
//[OperationContract]
//CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: 在此添加您的服務作業
[OperationContract]
double add(double a, double b);
[OperationContract]
double sub(double a, double b);
[OperationContract]
double mul(double a, double b);
[OperationContract]
double div(double a, double b);
}
public class Service1 : IService1
{
// TODO: 在此添加您的服務作業
public double add(double a, double b)
{
return a + b;
}
public double sub(double a, double b)
{
return a - b;
}
public double mul(double a, double b)
{
return a * b;
}
public double div(double a, double b)
{
return a / b;
}
}
1.1.1.4 找到 \GSOAP\gsoap-2.8\gsoap\bin\win32
1.1.1.5 用CMD進入到該目錄下面,如
圖表 5.9.6?1
1.1.1.6 輸入命令產生C++ XXXX.h檔案
命令如下:
wsdl2h -s -t typemap.dat -o service2.h
http://localhost:52852/WCFService1/Service.svc?wsdl
Typemap.dat 檔案要放在 GSOAP\gsoap-2.8\gsoap\bin\win32目錄下,執行完成該命令將會產生service2.h檔案。
圖表 5.9.6?2
1.1.1.7 在輸入 產生soapStub.h,soapC.cpp等檔案。
將service2檔案拷貝到gsoap\import檔案 夾後執行
命令: soapcpp2 -C -I D:\soft\GSOAP\gsoap-2.8\gsoap\import service1.h -L -i –x
soapcpp2 -C -I F:\VC使用GSOAP調用C#WCF服務\gsoap-2.8\gsoap\import\ service2.h -L -i -x
圖表 5.9.6?3
執行結果
圖表 5.9.6?4
1.1.1.8 把產生的檔案COPY到VC項目中,並添加到VC項目中
因為沒有使用STL,所以需要包含stdsoap2.h和stdsoap2.cpp,這兩個檔案在GSOAP裡可以找到。
1.1.1.9 設定新加的所有.cpp檔案不要使用先行編譯頭
圖表 5.9.6?5
1.1.1.10 編譯串連錯誤處理:
Stdsoap2/h 去掉 :extern SOAP_NMAC struct Namespace namespaces[];
十:添加執行代碼:
const char* server="http://XXXXX:81/Service1.svc"; //"http://localhost/srv/srv.asmx";
BasicHttpBinding_USCOREIService1Proxy ss(server,SOAP_C_UTFSTRING);
double aa=10;
double bb =20;
_tempuri__add tempuri__add;
tempuri__add.a=&aa;
tempuri__add.b =&bb;
_tempuri__addResponse tempuri__addResponse ;
if (ss.add(&tempuri__add,&tempuri__addResponse)==SOAP_OK)
{
double cc=*tempuri__addResponse.addResult;
ss.destroy();
return 0 ;
}
if (ss.error)
{
ss.soap_stream_fault(std::cerr);
ss.destroy();
return 0 ;
}
圖表 5.9.6?6
1.1.1.11 運行出錯處理
soapBasicHttpBinding_USCOREIService1Proxy.cpp,BasicHttpBinding_USCOREIService1.nsmap 檔案中的namespaces[]替換
1.1.1.12 已成功實現C++調用C# WCF服務
圖表 5.9.6?7
n 在工程中定義 WITH_NONAMESPACES 宏
n 嘗試 "#include "namp.nsmap" "
VC使用GSOAP(2.8.14)調用C#WCF服務