我在网上找了好多的这方面的文章,真正能够实现出来的几乎没有。
只有我在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" "