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 = &paraTest; //设置形参
    p.reportWork(&nsa, nar);

    qDebug() <<QString::fromStdWString(*(nar.reportWorkResult));

    system("pause");

}

保证VS的服务在运行,这边看到的运行结果如下所示:

,如此:搞定。

 

posted on 2022-08-23 12:28  明太宗朱棣  阅读(174)  评论(0编辑  收藏  举报

导航