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