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

时间:2021-10-19 04:14:38

近期接手一部分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();