您的位置:首页 > 编程语言 > C#

VC使用GSOAP(2.8.14)调用C#WCF服务

2015-10-16 13:29 615 查看
我在网上找了好多的这方面的文章,真正能够实现出来的几乎没有。

只有我在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" "
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: