C++调用WebService服务问题总结

近期接手一部分C++研发工作,同时与.NET开发小组进行软件功能协作,于是需要调用.NET WebService服务,已完成数据的网络通讯业务功能;结束之余,将手头碰到的问题总结罗列如下:

  • C++如何调用.NET WebService服务。
  • 如何进一步灵活设定WS服务的地址。
  • ATLSOAP: CSoapRootHandler::InitializeSOAP -- failed to get SAXXMLReader调用错误问题。

1、C++如何调用.NET WebService服务

在.NET中使用WS服务时,引用该服务,然后实例化服务对象、直接调用对象成员方法,操作使用还是较方便的;而在C++中则需要费点周折,需要结合使用ATL Server及发布的WS服务地址。

(1)、在Visual Studio 2008以及以后版本中,微软停止了非托管C++的直接WebService引用。不过ATL Server代码已经托管到开源网站上,我们可以找到ATL Server的源代码(http://atlserver.codeplex.com/),下载该源码包,之后用回到包中的include目录的所有文件。

(2)、获取发布后的WS服务地址,然后在VS2005中,随意建立一个WIN32应用程序项目,点击项目右键,选择Add Web Reference,输入WS服务地址完成添加;之后VS会在项目中生成针对该WS服务的头文件WebReference.h(头文件中包含了一个CWebService类)。

(3)、最后,在C++项目代码中,添加ATL Server所有头文件与引用atlsoap.h、及编译引用的WebReference.h头文件,使用其中CWebService类,实例化对象及调用其成员方法。

2、如何进一步灵活设定WS服务地址

WS服务的地址,可能每次的发布,其地址是不同的,而我们刚编译引用的WebReference.h头文件,其类的构造方法中已经固定了地址,如

CWebServiceT(ISAXXMLReader *pReader = NULL) : TClient(_T("http://192.168.1.181:8033/asmx/WebService.asmx"))

那么,这就需要定义和改变其入口参数CWebServiceT(ISAXXMLReader *pReader = NULL) : TClient(strWebService)。

3、ATLSOAP: CSoapRootHandler::InitializeSOAP -- failed to get SAXXMLReader错误问题

在调用时,HRESULT hr = pService->UpdateData(),可能会返回失败,调试会发现该错误;那么可以尝试在调用前后加入以下方法代码的调用:

::CoInitialize(NULL);

pService->SetProxy();

// Do your stuff 

pService->Uninitialize();

::CoUninitialize();

 

 

转载于:https://www.cnblogs.com/dahuang-cn/p/6059665.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++调用Web服务接口,可以使用SOAP协议,它是一种基于XML的协议,用于在不同的应用程序之间进行通信。以下是使用SOAP和C++调用Web服务的一般步骤: 1. 创建SOAP消息:使用SOAP协议创建需要发送到Web服务的XML消息。 2. 配置SOAP通信:设置Web服务的URL和SOAP操作的名称。 3. 发送SOAP消息:将SOAP消息发送到Web服务,并接收响应。 4. 解析SOAP响应:将Web服务返回的SOAP响应解析为C++对象。 下面是一个简单的示例,演示如何使用C++和SOAP协议调用Web服务: ```c++ #include "soapH.h" #include "MyWebServiceSoapProxy.h" int main() { MyWebServiceSoapProxy service; ns1__Add addRequest; ns1__AddResponse addResponse; addRequest.a = 3; addRequest.b = 5; if (service.Add(&addRequest, &addResponse) == SOAP_OK) { std::cout << "The sum of 3 and 5 is: " << addResponse.AddResult << std::endl; } else { service.soap_stream_fault(std::cerr); } return 0; } ``` 在上面的代码中,我们使用了gSOAP工具自动生成的MyWebServiceSoapProxy类,它包含了所有我们需要调用Web服务的方法和数据结构。在本示例中,我们调用了名为Add的Web服务方法,并传递了两个整数作为参数。如果调用成功,我们将在控制台上输出它们的和。 请注意,此示例仅为演示如何使用SOAP和C++调用Web服务。实际上,SOAP协议有时可能会变得过于冗长和复杂,因此可以考虑使用其他协议,如REST或JSON-RPC。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值