VC++写的程序本来通过HTTP调用ISAPI进行处理,但是感觉模式有些老了,想用Web Service试试。
C#写程序调用WebService是很方便的,但是VC++有些麻烦。看了几种方法,比如MSSOAP.DLL,还有其他的库,感觉比较老了,并且最近没有更新,倒是gSOAP一直更新,最新的是2.8.18。
先是建立了一个Web Service,用的是C#,默认的HelloWorld。
然后使用gSOAP建立访问代码:
-先用wdsl2h产生h文件,命令格式类似:wsdl2h -o my1.h http://localhost:1687/webservice1.asmx?WDSL
--运行的时候有可能会提示找不到stdvector.h等文件,最简单的就是将wdsl2h放到gsoap的import目录中运行。
-再用soapcpp2产生访问代码,命令格式类似:soapcpp2 my1.h
--会产生一堆的文件。
再建立一个VC++的对话框应用,建立一个textbox和一个button。
-将gsoap产生的一些文件加入到此工程中,包括:.nsmap、stdsoap2.h、stdsoap2.cpp、soapC.cpp、soapClient.cpp、soapH.h、soapStub.h。
--如果添加了多于的会提示定义重复等,然后移除就可以了,比如soapClientLib.cpp就不要。
-编译中可能会提示stdafx.h文件,可以设置工程不需要预编译头文件,或者在有关的文件最开始加入 #include "stdafx.h"就可以了。
-添加textbox的变量,button的处理函数,添加代码:
#include "soaph.h"
#include "webservice1soap.nsmap"
void CMFCApplication2Dlg::OnBnClickedButton1()
{
struct soap soap1;
soap_init(&soap1);
char szSvr[] = "http://localhost:32392/WebService1.asmx"; //http://localhost:32392/WebService1.asmx?op=HelloWorld
_ns1__HelloWorld hw1;
_ns1__HelloWorldResponse hws1;
soap_call___ns1__HelloWorld(&soap1, szSvr, "",&hw1,hws1);//HelloWorld
if (soap1.error)
{
//get error message
return;
}
m_sRes = hws1.HelloWorldResult->c_str();
soap_destroy(&soap1);
soap_end(&soap1);
soap_done(&soap1);
UpdateData(FALSE);
}
-然后编译VC++工程,应该会成功。
测试过程:
启动WebService服务;
启动VC++应用,点击button1,结果会显示到textbox中。