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

VC使用GSOAP调用C#WCF服务

2015-09-08 13:40 429 查看
首先声明:文章中的内容大都来源于网络,做的过程遇到了不少问题,所以想写下此文,记录一个完整的过程,以飨后人。

gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在Windows、Linux、MAC
OS和UNIX下使用C和C++语言编码,集合了SSL功能。

下载地址:http://sourceforge.net/projects/gsoap2

官方网站:http://genivia.com/Products/gsoap/index.html

1、配置gSOAP

下载gSOAP,解压后在gsoap\bin\win32里找到wsdl2h.exe和soapcpp2.exe程序。通过这两个程序可以生成客户端需要的C/C++文件。这两个程序的使用方法:

wsdl2h.exe: 编译wsdl文件生成c/c++头文件

-o 文件名,指定输出头文件

-n 名空间前缀 代替默认的ns

-c 产生纯C代码,否则是C++代码

-s 不要使用STL代码

-t 文件名,指定type map文件,默认为typemap.dat

-e 禁止为enum成员加上名空间前缀
soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的c/c++文件

(如果使用STL,需要从压缩包里找到stlvector.h放到soapcpp2.exe目录下,否则运行失败)

-C 仅生成客户端代码

-S 仅生成服务器端代码

-L 不要产生soapClientLib.c和soapServerLib.c文件

-c 产生纯C代码,否则是C++代码(与头文件有关)

-I 指定import路径(见上文)

-x 不要产生XML示例文件

-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)

wsdl2h -s -t D:\gsoap-2.8\gsoap\typemap.dat -o service1.h http://192.168.20.251:8080/Service1.svc?wsdl
soapcpp2 -C -I D:\gsoap-2.8\gsoap\import service1.h -L -i -x

2、创建VC工程,把生成的文件拷到工程目录

把“\gsoap-2.8\gsoap”目录下找到
stdsoap2.cpp 和stdsoap2.h 也复制到工程中去;设置新加的所有.cpp文件不要使用预编译头。

3、调用Web服务:

#include
"stdafx.h"

#include
"soapH.h"

#include
"soapClientServiceSoapBindingProxy.h"

#include
"ClientServiceSoapBinding.nsmp"

int
_tmain(int argc,_TCHAR* argv[])

{

const char* server="http://XXXXX:81/Service1.svc";

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 ;
}
}

4、解决415错误:

这个是由于服务端客户端soap协议不统一造成的,我使用的gsoap是2.8.8版本,编译出来的xxx.nsmap中soap协议是1.2版本,连接的wcf服务是1.1版本。

目前这个问题有两个方法可以解决,1,手工修改nsmap文件中的协议,2,使用gsoap编译器“-1”编译选项(此方法未测试,据说有些时候也无效)

5、解决中午乱码的问题:

通过上面的步骤,已经可以成功连接了,但是在遇到中文字符的时候,问题就出现了。

5.1中文字符返回值

这个解决的办法主要就是要把字符转换成utf-8

1>设置GSOAP的编码模式 soap_set_mode(soap, SOAP_C_UTFSTRING);

2>将传输回来的字符流进行字符转换

3>字符转换函数

5.2中文字符参数

中文字符返回值的问题解决了,新的问题又出现了,如果按照上面的设置,如果是有中文字符的参数,这个参数就会乱码了,真是一波刚平一波又起啊。

有人提出了用setloacal的方法来解决,不过这个办法我使用的时候无效。

返回值乱码,我们是将其从转换成utf-8的编码方式,那么,我们传人的参数有问题,在传人参数之前,先将其转换成utf-8是不是就可以呢。(当前是unicode,大概等价于utf-16,未查证)

如果是linux系统,貌似有直接的装换函数,可惜我是在windows平台,那就自己写吧,有了上面的转换方法,照猫画虎,也就是那样。

调用方法

CString str = _T("测试中文");

std::wstring ss = str;

std::string var =Convert(ss,CP_UTF8);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: