C++程序中调用WebService的实现

前言

因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C++ MFC中调用那些WebService中写好的函数,中间也是遇到了一些不懂和不解的地方,好在通过度娘上的一些资料和自己的研究逐一的解决了,写这篇文章的主要目的是,第一:让自己记得更清楚,也方便以后不记得了可以及时回想起来。第二:让其他的一些和我碰到一样问题的朋友能更好的解决此问题。内容仅供参考,如有不对之处希望大家提出来一起交流。

第一部分:WebService的创建

首先,打开VS2005,“File->New->Project|Visual C#|ASP.NET Web Service Application”,新建一个名称为“MyWebService”的应用程序。

接下来,你可以在新建的工程文件中修改代码,你可以将[WebService(Namespace = "http://tempuri.org/")]中的tempuri.org改为你的IP地址或域名地址目录,你也可以在类里面添加新的代码,如下所示。

using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;

namespace MyWebService
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://192.168.22.36/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod(Description = "Default Function")]
        public string HelloWorld()
        {
            return "Hello World";
        }
        // 新添加的方法
        [WebMethod(Description = "My Sample Function")]
        public int Sum(int a, int b)
        {
            return a+b;
        }
    }
}

接下来,你可以debug运行一下你现在的程序,可以看到现在的效果是这样的。

点击"Sum"超链接,跳转到下一个页面。

在编辑框中输入a = 10,b = 100,点击调用,就可以看到XML格式返回的WebService结果。

到这里,就说明我们的Web Service的环境没有问题。接下来,我们要做的就是把我们建立好的Web Service发布到iis服务器上去。

第二部分:WebService的发布

首先,你可以在你自己的桌面新建一个文件夹(SampleWebService),这里有一个地方需要注意,我们需要右键点击文件夹属性,选择安全tab页,在安全页下面点击“编辑”,然后在弹出的页面里面添加EveryOne的组或用户名(EveryOne的SYSTEM的权限全部勾选允许)。

设定完后的图片如下:

然后,进入到你第一步过程中新建好的WebService程序,选择Release编译环境,在“Solution Explorer”下面选择你的WebService程序“MyWebService”,点击右键选择“Publish“,弹出“Publish Web”对话框,在弹出的对话框中设置”Target Location“为你刚才新建的文件夹”SampleWebService“的路径,点击”Publish“按钮,如下图所示。

接下来,我们来到”Internet信息服务(IIS)管理器“,点击网站右键选择“添加网站”,在弹出的”添加网站“对话框中设置“网站名称”为SampleWebSite,物理路径为我们上面新建的文件夹的路径(也就是C:\Users\Administrator\Desktop\SampleWebService),“端口号”为避免重复,我们可以把它修改为8081,点击”确定“按钮,如下图所示。

接下来,我们双击”Sample Website主页”下面的“目录浏览”,点击启用。

接下来,我们来到“应用程序池”,选中我们新建号的应用程序池“SampleWebSite”,点击右键选中“高级设置”,在弹出的高级设置对话框中将“启用32位应用程序”设置为True。

到这里,我们的WebService就发布完成了。你可以点击iis管理器右手边的“浏览网站”下面的“浏览*:8081(http)”来看一下你的WebService是否发布成功,发布成功的话会显示如下页面。

第三部分:调用WebService

首先,我们新建一个Win32应用程序“Sample”。然后进入应用程序,在“Solution Explorer”下面选择你的Win32应用程序“Sample”,点击右键选择“Add Web Reference“,弹出“Add Web Reference”对话框,在弹出的对话框中设置”URL“为我们在第二部分中发布的链接“http://localhost:8081/Service1.asmx”,设置“Web reference name”为SampleRefer,点击”Add Reference“按钮,如下图所示。

执行完这步以后,我们可以看到应用程序中多出来了几个文件。

接下来,我们在Sample.cpp中添加如下代码。

#include "stdafx.h"
#include <stdio.h>
#include "WebService.h"

using namespace Service1;

int _tmain(int argc, _TCHAR* argv[])
{
	// 初始化com组件运行环境
	::CoInitialize(NULL);
	// 如果第八行没有命名空间Service1
	// 这里可以写成Service1::CService1 ws
	CService1 ws;
	int nNum1 = 10;
	int nNum2 = 100;
	int nSum = 0;
	HRESULT hr = ws.Sum(nNum1, nNum2, &nSum);

	printf("The Sum of the two num is:%d\n",nSum);
	getchar();

	return 0;
}

运行程序,我们可以得到下面的结果。

总结

至此,我们的C++程序中调用WebService的整个实现过程都介绍完毕,对于MFC的应用程序,和Win32的应用程序的实现代码没有什么区别,这里我们就不多做介绍。对于我来说,过程中主要遇到的问题主要还是在WebService发布到iis上时的一些环境的配置不是很准确,例如发布的时候我们必须Release编译环境,必须设置Everyone的权限等。还有就是写代码的时候不是像我们调用类里面的函数一样去调用WebService中的函数,我们要做一个com组件的初始化,为了方便要定义命名空间,调用的函数有一个HRESULT类型的返回值等等。最后还是希望大家可以相互学习吧,有什么不对的地方一起讨论。

时间: 2025-01-13 00:21:46

C++程序中调用WebService的实现的相关文章

(转)WCF中调用WebService出错,大家帮忙看看,回答就有分

http://bbs.csdn.net/topics/390542345 在WCF项目里面添加了一个WebService引用,然后在我们调用这个WCF服务时,老出错,提示在 ServiceModel 客户端配置部分中,找不到引用协定“HISInterfaceService.SmsAPIPortType”的默认终结点元素.这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素.我在网上也搜了一下这个错误,也在配置文件中添加了WebService的终结点什么的,求

在ASP.NET 中调用 WebService 服务

一.webservice定义 详见 https://www.cnblogs.com/phoebes/p/8029464.html 二.在ASP.NET MVC 中调用 webservice 1:要调用webservice,前提是已经有一个可以被访问到的webservice 服务的 webserviceurl. 2:在 Visusl Studio 2017 中新建一个 ASP.NET MVC 的项目,建好之后,大概是下面这样子的结构 3:鼠标右键点击项目名称,在弹出的菜单框中选择添加--->服务引

在android程序中调用shell命令与脚本

最近做android的一个功能就是调用shell命令来进行一些系统级别的操作,比如说是关机开机之类的,现在总结一下具体的用法以及遇到的坑(基于我所用到的,没用到的我就不说了) (1) Runtime.getRuntime().exec("ls"); 这是最简单的一种,你输入后就能就会执行ls命令,如果要获得输出的话可以这样写 Process p = Runtime.getRuntime().exec("ls"); String data = null; Buffer

如何在程序中调用Caffe做图像分类

Caffe是目前深度学习比较优秀好用的一个开源库,采样c++和CUDA实现,具有速度快,模型定义方便等优点.学习了几天过后,发现也有一个不方便的地方,就是在我的程序中调用Caffe做图像分类没有直接的接口.Caffe的数据层可以从数据库(支持leveldb.lmdb.hdf5).图片.和内存中读入.我们要在程序中使用,当然得从内存中读入.参见http://caffe.berkeleyvision.org/tutorial/layers.html#data-layers和MemoryDataLay

Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)

文章目录:                   1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Application 有何妙用: 5. MJ0011 关于 Native Application 的文章整理: 6. 互联网上其他关于 Native Application 的文章整理: 7. 小结: 1. 引子: 其实在好久以前就看了 MJ0011 翻译的那个<Native 应用程序详细>系列的文

Live555 中的客户端动态库.so的调用方式之一 程序中调用

1.  打开动态链接库:    #include <dlfcn.h>    void *dlopen(const char *filename, int flag);    该函数返回操作句柄,如:    void *pHandle = dlopen(strSoFilePath, RTLD_LAZY); 2.  取动态对象地址:    #include <dlfcn.h>    void *dlsym(void *pHandle, char *symbol);    dlsym根据

WinCE平台的C#程序中调用MessageBeep发出一些系统自带的声音,而不用使用playsound

[DllImport("coredll.dll", EntryPoint = "MessageBeep")] public static extern bool MessageBeep(int iType); int i = 0x00000040; ClassPublicFunction.MessageBeep(i); 声音的类型 public enum BeepType {  SimpleBeep = -1,  IconAsterisk = 0x00000040,

c程序中调用matlab

c程序调用matlab 方法一: 在c程序中调用matlab引擎(相当于打开一个精简版matlab然后往里输入命令,即客户机/服务器模式, c程序为客户机,matlab作为本地服务器) 方法二:将m文件打包成dll文件,然后在c语言环境下调用 优缺点分析: 方法一,易于实现,可以实时监控程序的运行,但独立性差,速度慢,需要安装完整版matlab,且每次调用都会启动matlab.exe进程: 方法二,实现复杂,调试麻烦,但只需要安装mcr(matlab component runtime),耗费资

Winform 中调用WebService

第一次在WINFORM中调用WebService,看了下别人的例子,感觉应该很简单. 参考了这位兄弟的内容 http://www.cnblogs.com/loveCloud/archive/2012/01/10/2317830.html 很迅速的完成了UI的制作,添加引用服务,嗯,输入WebService的地址,就能第一次体验结果了. 不过结果让我很失望:DeBug 一直提示我这句话...服务器无法处理请求. ---> 未将对象引用设置到对象的实例. 完了,两眼一抹黑.很自然的点了帮助,说是远程