C++(gSoap) 调用 C# WebService 服务
首先感谢这位大神:https://blog.csdn.net/ggz631047367/article/details/44568727,基本上所有的内容都是参考这篇博客写的。下面介绍开发过程:
1、C# webService 的搭建,这个从网上随便找一个例子,照着做就行了,https://www.cnblogs.com/sunny3158/p/16047388.html 或者 https://blog.csdn.net/bubblex/article/details/114261009 都可以;
2、写好的工程如下所示:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace WebApplication1 { /// <summary> /// WebService1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public string reportWork(string workContext) { return "收到内容:" + workContext; } } }
3、点击运行按钮,会在一个浏览器中打开你所支持的API,如下图所示:
4、生成C++的头文件:命令行中输入
wsdl2h.exe -t typemap.dat -o hello.h http://localhost:30005/WebService1.asmx?WSDL
其中 wsdl2h.exe就是从gSoap的安装包里面拷贝出来的(wsdl2h 的意思是 wsdl文件 to h文件),与soapcpp2.exe在头一个文件夹。wsdl2h.exe默认生成的是C++的头文件,要生成C的头文件,可以加参数 -C,具体可查看 https://www.cnblogs.com/liushui-sky/articles/9354655.html ;
typemap.dat 文件也可以从gsoap的解压包中找到,可以复制出来进行修改,本次中将46行
# xsd__string = | std::wstring
的注释放开,用于处理C++中的中文,其他可根据需求自行修改,如在C语言中处理中文,可将41行的注释放开等。
文件路径 http://localhost:30005/WebService1.asmx?WSDL 可以从第三部 浏览器中 获取,
注意:里面的内容不要瞎改,localhost不能改为127.0.0.1(不要自作聪明);
-o 参数指定了生成的文件名 hello.h
5、生成C++需要的其他文件
soapcpp2.exe -i -IC:\gsoap-2.8\gsoap\import hello.h
其中 soapcpp2.exe就是从gSoap的安装包里面拷贝出来的, -i 是生成C++代理文件,-I 指定了生成C++文件所依赖的头文件所在的路径,(就是gsoap解压出来的包,所包含的import文件夹的路径,注意中间不能有空格),hello.h是刚刚生成的头文件。
到此,所有准备工作就完成了。
6、编写C++工程,使用Qt作为集成开发环境,pro文件如下所示:
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle DEFINES += QT_DEPRECATED_WARNINGS HEADERS += ../Public/soapWebService1SoapProxy.h\ ../Public/soapH.h\ ../Public/soapStub.h\ ../Public/stdsoap2.h\ SOURCES += main.cpp \ ../Public/soapC.cpp\ ../Public/soapWebService1SoapProxy.cpp\ ../Public/stdsoap2.cpp\ OTHER_FILES += ../Public/WebService1Soap.nsmap INCLUDEPATH += ../Public
说明:Public是刚刚处理hello.h及其生成文件所在的目录。
main.cpp 如下所示:
#include "soapWebService1SoapProxy.h" #include "WebService1Soap.nsmap" #include <iostream> #include <QDebug> #include <QString> int main(int argc, char *argv[]) { WebService1SoapProxy p; _tempuri__HelloWorld nsh; _tempuri__HelloWorldResponse nsr; p.HelloWorld(&nsh, nsr); qDebug() << QString::fromStdWString(*(nsr.HelloWorldResult)); _tempuri__reportWork nsa ; _tempuri__reportWorkResponse nar; std::wstring paraTest = QString::fromLocal8Bit("傻子在学习").toStdWString(); nsa.workContext = ¶Test; //设置形参 p.reportWork(&nsa, nar); qDebug() <<QString::fromStdWString(*(nar.reportWorkResult)); system("pause"); }
保证VS的服务在运行,这边看到的运行结果如下所示:
,如此:搞定。