一. 按照原来预研究的结果,使用gsoap的方法如下:

soapcpp2.exe -C weather.h -I E:\temp\gsoap-2.8\gsoap\import(E:\temp\gsoap-2.8\gsoap\import是我本地的路径),这样可以生成C++文件(soapClient.cpp, soapH.h, soapStub.h, WeatherWebServiceSoap.nsmap),然后还需要stdsoap2.cpp和stdsoap2.h 2个文件,编译的时候把这些文件加到工程中。调用的方法会在soapStub.h 头文件中产生。

参照了以后几个wiki:

二. 以上步骤我本地测试网上公开的天气接口,证明是可用的,后面第三方接口提供了,我安装以上方法去使用第三方的webservice接口,发现一些问题:

编译的时候出现找不到"stdafx.h"

解决:通过在响应的.cpp中最开始添加#include "stdafx.h",修复该编译错误

编译时遇到 stdsoap2.obj : error LNK2001: 无法解析的外部符号_namespaces

解决: stdsoap2.h,添加

#ifndef WITH_NONAMESPACES    #define WITH_NONAMESPACES    #endif

三. 以上问题解决后,又遇到一个更奇葩的问题,因为要调用第三方的二个接口,但是这二个接口确实二个不同的webservice,最开始我采取了比较普通的方法,按照gsoap的方法分别操作了二次,并且把这二次生成的文件放在了二个目录中,在工程中也是按照这样的结构添加文件,但是

编译的时候出问题"error C2374: “namespaces”: 重定义;多次初始化 gsoap",首先我就是谷歌了,按照一些搜索到的方法去做了,发现还是不行,造成这个问题的原因是因为使用多个webservice,每个.nsmap中都会定义struct Namespace,造成了重定义,怎么办呢?

解决: 后面找了些文章,发现我们可以将多个wsdl文件统一生成为一个头文件,然后再用这个统一的头文件来生成gsoap代码则不会有冲突问题了(解救了我啊),方式是:

wsdl2h -o file.h file1.wsdl file2.wsdl file3.wsdl‘

然后在执行【一】中的【2】,生成C++文件,这样做了后,生成了C++文件,然后加到项目中,编译,成功,小开心了一下,然后继续去测试能否获取到数据。测试的时候发现一直没有获取到数据,跟了下代码,发现返回调用公共的接口返回415错误,谷歌了下,发现是因为service端只支持 soap 1.1,而gsoap生成客户端代码默认是1.2

解决: gsoap 的soapcpp2的参数 -1 为soap 1.1 -2为soap1.2,具体就是把【一】【2】中的soapcpp2.exe -C weather.h -I E:\temp\gsoap-2.8\gsoap\import改成soapcpp2.exe -1 -C weather.h -I E:\temp\gsoap-2.8\gsoap\import,这样就支持soap1.1了。

改了之后再测试,发现一直返回12错误,崩溃~~~,网上找了好多,也没发现是什么问题。

为了解决问题,继续找啊,发现一个blog:gSoap编写代码访问WCF服务,发现这个博主使用的是代理类的形式,我想反正我那条路已经断了,要不也参照下这个blog试一下吧,说干就干,参照这,把gsoap的操作改成一下方式了:

wsdl2h.exe -v -o test.h WebService1.wsd WebService2.wsd

soapcpp2.exe -1 -C -j -I E:\temp\gsoap-2.8\gsoap\import test.h

然后把XXXProxy.cpp中的方法中的soap_endpoint的值改一下,为什么要改呢?因为默认gsoap会将所有的service的endpoint加在一起赋值给每个接口,这样就会出现类似

soap_endpoint=

"http://10.32.4.20:8012/QueryInterface.asmxhttp://10.32.4.20:9988/CommonService.svc";

的形式,其实我们需要的是

soap_endpoint = "http://10.32.4.20:8012/QueryInterface.asmx";

所以需要手动去把有类似问题的都改一下,改好后再重新编译,OK,都没有问题,继续测试,OMG,完美,可以正常访问,心里终于舒坦了。

四. gsoap设置超时

修改gsoap自动生成的代码才能进行超时设置(我这边访问web service的代码都是gsoap工具自动生成.根据wsdl接口)

找到生成的soapwwwsdlBindingProxy.cpp文件

找到你要设置超时的那个调用服务器的方法

找到该方法代码 struct soap *soap = this;

在该代码下添加如下三行代码(时间大小根据项目自行调整)

soap->recv_timeout = 2;//接受 (单位是秒)

soap->send_timeout = 2;//发送 (单位是秒)

soap->connect_timeout = 2;//连接(单位是秒)

--以上就是这次通过gsoap使用webservice的全部过程,记录下来,方便自己以后查阅,也希望对遇到同样问题的你,有所帮助。

以上有参考一下wiki:

gsoap之client端引用多个service时命名冲突

gsoap 调用 WCF 415 错误

gsoap初始化释放_通过gsoap使用webservice相关推荐

  1. gsoap初始化释放_gSOAP中文文档

    1.背景 转贴 2 gSOAP文档翻译计划 2.1 gSOAP文档翻译计划(序) 前一阵子需要在unix c平台下创建一个webservice应用.头痛之余,上网查询相关资料,偶然发现了gSOAP开发 ...

  2. gsoap初始化释放_gsoap内存管理与释放

    (一)gSoap客户端调用WebService完成后注意内存释放顺序 1 //Soap资源清理 2 soap_destroy(soap_sp.get()); //清理反序列化的类实例 3 soap_e ...

  3. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager

    8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...

  4. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  5. 智能指针的释放_看完这篇,别再说不会智能指针了

    C++智能指针 一.智能指针的作用 上一篇介绍了内存池的原理和实现,详情请见内存池设计与实现: 内存池可以帮助我们有效的对内存进行管理,智能指针可以很方便的管理指针,避免出现内存泄漏: 智能指针的作用 ...

  6. linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第四十一章嵌入式Linux LED驱动开发实验 上一章我 ...

  7. string 释放_由String,String Builder,String Buffer 引起的面试惨案

    前言 String,StringBuilder,StringBuffer的区别是啥?这个面试题估计每个JAVA都应该碰到过吧.依稀记得第一次面试的时候,面试官问我这个问题时,心想着能有啥区别不都是拼接 ...

  8. 协议处理程序初始化失败_域间路由协议的内容有哪些 域间路由协议的内容介绍【详解】...

    域间路由协议,域间路由协议的内容有哪些? 当前Internet被划分为多个自治系统,自治系统是一个实体,一般是指隶属于一个管理机构的路由器集合.每个自治系统可以制定自己的路由策略.自治系统内部的路由器 ...

  9. springboot初始化逻辑_详解Spring Boot中初始化资源的几种方式

    假设有这么一个需求,要求在项目启动过程中,完成线程池的初始化,加密证书加载等功能,你会怎么做?如果没想好答案,请接着往下看.今天介绍几种在Spring Boot中进行资源初始化的方式,帮助大家解决和回 ...

最新文章

  1. IIS环境下如何批量添加、修改、删除绑定的域名
  2. 安信可ESP-12F(ESP8266)介绍与使用
  3. FFmpeg再学习 -- 视音频基础知识
  4. Java hdfs连接池_Java使用连接池管理Hdfs连接
  5. JDBC——编程式事务的实现逻辑
  6. Browser-Bookmark-Codeing
  7. hadoop集群之HDFS和YARN启动和停止命令
  8. 万字长文!搞定逃不脱的 DNS 面试题
  9. 蓝桥杯 ADV-16 算法提高 和最大子序列
  10. 生成树切分matlab_机器学习——手把手教你用Python实现回归树模型
  11. idea 新建java类 乱码,Intellij IDEA 2019 最新乱码问题及解决必杀技(必看篇)
  12. 嵌入式Linux系统工程师系列之ARM920T的MMU与Cache
  13. 网站内容收录不稳定/不收录的原因分析
  14. NYOJ 小明的存钱计划
  15. Pandas+随机森林数模实战日记
  16. spring+vue前后端端分离上传图片到后台静态资源目录(适合个人小项目)
  17. VS关闭vue语法检测
  18. [Python深度学习入门]实战一·Numpy梯度下降求最小值
  19. IE低版本提示下载新的浏览器js--IEOutTips.zip
  20. 观点 | 银行业数据应用的瓶颈与打开思路

热门文章

  1. 比特(bit)_二进制数
  2. 如何通过命令终端访问本地/局域网/远程的MySQL数据库_访问数据库_连接数据库_登录数据库
  3. arch linux界面优化,Archlinux 启动优化
  4. php数组按时间排序,按日期时间在PHP中对数组中的数组进行排序
  5. c 中头文件和源文件的区别是什么
  6. C语言项目:绽放的玫瑰花
  7. php.c drcom,校园网绕过Drcom安装自动登录程序到路由器
  8. 淮安中专学计算机哪个学校好,2021淮安初中十强排名 哪些初中比较好
  9. java jar killed_容器中Java 程序OOMKilled原因浅析
  10. js 转化为实体符_js转html实体的方法