`
jiagou
  • 浏览: 2530560 次
文章分类
社区版块
存档分类
最新评论

在C++中创建并使用WEB服务

 
阅读更多

web服务的确是.net中让人激动的部分——但它们本身比.net要大。其中的道理很简单。几乎所有你能叫出名字的服务都有一些执行服务器端代码的机制:你在浏览器的地址栏中输入一个URL;接收到你的请求,服务器上就开始运行什么东西,然后以html页面返回你要的结果。它可能是ASP,ASP.net,servlets,甚至是五年前通过CGI触发的perl本。因此想象一下,如果运行代码返回的是XML格式而非HTML格式的结果,并且服务请求并非是在浏览器地址栏中输入的url,而是某些代码中以HTTP中的GET方法向服务器请求获知URL地址。那么你现在得到的是一个程序和程序间的连接。正巧每种语言都一个类库,因此在HTTP中生成一个GET请求变得很简单,解析出XML也有了些捷径。这种方案给你提供了一种跨平台,跨语言,跨厂商乃至一切的方法,只要它们都在INTERNET上或是以其他的方式相连,我们就可以在某个程序的代码中调用另外一个完全不同的机器上的代码。

这就是隐藏在WEB服务背后的基本观念。但把代码当作函数而非页面,你该如何将参数传递给函数?如果它返回一个复杂的数据类型怎么办?如果一个WEB服务器上提供多于一种WEB服务怎么办?你如何找出那些名字并确认所需要的是哪种服务?这就是本文所要说明的问题。使用类似于WEB服务描述语言(说wizdle会更酷一些)开发有一定的标准,它们涵盖了这些技术细节。如果你用Visual Studio.NET创建一个WEB服务,它将满足这些标准。如果你只是需要WEB服务,而不管它是如何创建的,通过Visual Studio.NET,你会发现借用他人的代码是如此简单。

编写一个WEB服务

为了编写一个WEB服务,你至少要用一种方法写一个类。这个类必须有WebService属性,方法也要有WebMethod属性。举例来说,一个类可以代表一位客户,并且有一个可以获知客户船运信息的方法,或是能够在客户购物单上增加新物品的方法。WEB方法能够接受和返回任何可用的类型,包括你定义的对象实例。它们能做任何事情:维护数据库数据的内外一致性,做任何形式的运算,甚至调用另外一个WEB方法来完成任务。为了说明这一点,我将用Add的方法写一个CalculatorService类,如你所猜得那样,将两个数字加起来并返回他们的和。

我在Visual Studio.NET中创建了一个新工程。在Visual C++工程模板中,我选择了可管理的WEB服务。我将工程命名为Calculator。产生的代码包括了一个Class1类——虽然我可以在类的列表中选中它,并在属性窗口总改变它的名字,但我做的第一件事还是手工地将这个名字的.cpp文件和.h文件都改成了CalculatorService。(我努力避免类和名字空间重名,它会使Intellisense弄混)不管我怎么样取名,我必须手动的对文件Calculator.asmx作更改,我在Solution Explorer中双击它然后修改。修改后是:

<%@ WebService Class=Calculator.CalculatorService %>

我获得了一个叫做HelloWorld()的方法,把它改成Add()很简单——我仅仅更改了.cpp文件和.h文件的名称,改变了签名以便它能够接受浮点数,然后加了些代码以返回和。

类声明的结束部分:

using <System.Web.Services.dll>using namespace System;using namespace System::Web;using namespace System::Web::Services;namespace Calculator{    public __gc         class CalculatorService : public WebService    {    public:        [System::Web::Services::WebMethod]         double  Add(double x, double y);    };}

实现的部分:

#include "stdafx.h"#include "Calculator.h"#include "Global.asax.h"namespace Calculator{    double CalculatorService::Add(double x, double y)    {        return x + y;    }}

如果你是一直在跟着我做,你就能选择“开始”菜单中的DEBUG来测试代码。你并没有真正运行一个WEB服务,但这会开启一个WEB浏览器并将Calculator.asmx加载进去。这是一个真正应用你定义的类和方法的在WEB服务器上运行的文件,如果你愿意,打开一个浏览器窗口,输入这个URL:http://localhost/Calculator/Calculator.asmx。如果碰到任何问题,你要确定,你的WEB服务器已经启动,而且浏览器并没有使用代理服务器。在代理服务器上,localhost是代理服务器,而不是你的机器。你可以打开Add的链接看看为方法所生成的文档,甚至可以通过键入数字并点击执行按钮来测试。这时,将打开另一个浏览器窗口以显示你要求的包围在XML中的结果。比如,我输入2和3,得到如下XML:

<?xml version="1.0" encoding="utf-8" ?> <double xmlns="http://tempuri.org/">5</double>

2加3等于5,WEB服务看起来是在工作。

使用WEB服务

写一个WEB服务相当简单:你只需要一个类属性,一个方法属性和calculator.asmx文件,而这三个都由Visual Studio生成。如果只需其中一个会更简单。开头我建立了一个叫CalcTest to的可管理的C++程序。在能够使用WEB服务之前,你需要让你的工程知道去哪里找到它。我在Solution Explorer中右键单击CalcTest工程,然后选择添加WEB参数。添加WEB参数的对话框有一个可编辑框让你输入URL。你也能用目录在INTERNET或是自己的测试机器上寻找WEB服务。

最简单的方法是键入URL到Calculator.asmx然后按回车。你会看到和以前运行WEB服务工程时同样的文件。点击添加参数结束这个过程。

参数一旦添加,调用WEB服务就像调用任何C++类一样。添加参数建立一个头文件,这个文件在任何你想使用WEB服务时都可以包括进去。我把输出Hello World的行替换成了创建代表我的WEB服务的对象和使用它的代码。更改过的CalcTest.cpp文件是这样的:

#include "stdafx.h"#using <mscorlib.dll>#include <tchar.h>#include "WebService.h"using namespace System;// This is the entry point for this applicationint _tmain(void){    CalculatorService * Calc = new CalculatorService;    System::Console::WriteLine("1 plus 1 is {0}",                                __box(Calc->Add(1,1)));    return 0;}

(如果关键字不响应,查看我前面关于装箱和拆箱基本类型的专题文章)

当程序运行起来,它输出的,和我料想的一点不差:

1 plus 1 is 2

从代码中调用一个WEB方法就这么简单。如果你想知道在XML上发生了什么,为何你不需要从内部把数字解析出来?这仅仅是在你添加WEB参数时,给予你的诸多方便之一。

关于此点的可能性无穷无尽。你在服务器上运行的任何代码,如果你愿意,都能被别的代码通过INTERNET访问。安全性,认证,加密以及其它的对你都是可用的,并且也都被SOAP(WEB服务标准之一)所支持。既然那些文件实际上都是ASP.NET的一部分,所有你知道的有关ASP.NET同样可运用于.NET中的WEB服务。现在为何不试试程序对程序的整合? 

关于作者

Kate Gregory是Gregory咨询公司(www.gregcons.com)的创建者之一。2002年1月,被指派为MSDN的多伦多地区的主管。她在C++方面的经验可以追溯到Visual C++存在以前。她是一个在大学和微软中知名的演说家,涉及的内容包括NET, Visual Studio, XML, UML, C++, Java, 和Internet。Kate和她公司的同事们擅长于结合软件和网站的开发以创建活力十足的网站。她们创建针对WEB页面和其他程序的畅销软件。Kate还是很多有关Que的书的作者,包括Special Edition Using Visual C++ .NET.

分享到:
评论

相关推荐

    C++ Poco创建个非常简单web服务器

    C++ Poco创建个非常简单web服务器,需要先安装Poco库,配置好Poco头文件和库的路径,window和Linux下都可以编译运行,运行后在浏览器上输入网址:http://127.0.0.1:9980/ Linux环境下G++编译代码 g++ main1.cpp -o ...

    Visual C++源代码 97 如何创建Web信息服务虚拟目录

    Visual C++源代码 97 如何创建Web信息服务虚拟目录Visual C++源代码 97 如何创建Web信息服务虚拟目录Visual C++源代码 97 如何创建Web信息服务虚拟目录Visual C++源代码 97 如何创建Web信息服务虚拟目录Visual C++源...

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码)

    (牛客网C++课程)Linux 高并发Web服务器项目实战(带定时检测代码) 技术框架: 1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. ...

    VS2010使用c++、gSOAP创建的WebService 源码

    VS2010使用c++、gSOAP创建的WebService 源码 参考:http://blog.csdn.net/testcs_dn/article/details/51463367

    用c++写的ftp服务器端

    自己用c++写的ftp服务器端,还是蛮小巧实用的。下了以后在d盘建个001文件夹就可以使用了。

    创建Web信息服务虚拟目录小例子,C++.net源代码编写

    创建Web信息服务虚拟目录小例子,C++.net源代码编写

    使用C#创建webservice服务,并使用服务接口

    使用C#创建webservice服务,并使用服务接口得到C#动态库。然后可以使用C++程序调用

    基于C++实现的轻量级Web服务器源码+项目说明.zip

    使用线程池提高并发度,并降低频繁创建线程的开销 同步互斥的介绍 使用RAII手法封装互斥器(pthrea_mutex_t)、 条件变量(pthread_cond_t)等线程同步互斥机制,使用RAII管理文件描述符等资源 使用shared_ptr、weak_...

    C++Builder_5_开发人员指南

    第三部分“编写分布式应用程序”描述如何创建Web服务器应用程序;第四部分“开发基于COM的应用程序”描述如何创建可与其他的基于COM的API对象相互操作的应用程序;第五部分“创建定制组件”讲述如何设计和实现自己的...

    VS2015 C++ 创建和调用webservice

    针对目前VS2010后,不能直接引用webservice的问题,做了总结,根据整理的文档内容可利用C++很方便的进行webservice的创建和调用,适合新手

    C++Builder核心编程技术

    ,ActiveX框架,“Type Library”编辑器,创建ActiveX,OLE自动化,使用WinSock,使用FTP控件,使用UDP控件,使用HTTP控件,使用HTML控件,使用SMTP控件,使用POP控件,使用NNTP控件,创建Web服务器应用程序,Web...

    Visual C++实践与提高-COM和COM+篇『PDF』

    5.3 在Vsual C++中使用ActiveX控件——例程VCActiveX 5.3.1 创建ActiveX控件包容器程序 5.3.2 加载ActiveX控件 5.3.3 设计时访问控件的属性 5.3.4 运行时访问控件的属性和方法 5.3.5 处理控件的事件 5.4 在Visual ...

    C++ BUILDER 5 开发人员指南 (2010 年度畅销榜

    第三部分“编写分布式应用程序”描述如何创建Web服务器应用程序;第四部分“开发基于COM的应用程序”描述如何创建可与其他的基于COM的API对象相互操作的应用程序;第五部分“创建定制组件”讲述如何设计和实现自己的...

    C++ On Air:轻量级C ++ Web应用程序服务器库-开源

    ConAir使用嵌入式的http服务器和Interpp解释器来提供html服务,并处理来自C ++应用程序中的http请求。 此内部服务器在C ++应用程序和客户端JavaScript接口之间建立双向Web套接字连接,以通过Web进行交互式脚本编写...

    poco c++ libraries_1.31

    POCO C++库是开源的用于简化和加速C++开发面向网络、可移植应用程序... POCO 严格使用标准ANSI/ISO C++创建, 包含标准库. 程序库的贡献者试图在使用C++高级特性、易于理解的类、干净的代码、连续及易于维护间得到平衡.

    web聊天室创建程序

    web聊天室创建程序,适合初学者不太懂编程的人学习观看

    C库创建简单的HTTP服务器和Web应用程序。-C/C++开发

    Onion http服务器库Travis状态Coverity状态Onion是一个C库,用于创建简单的HTTP服务器...它使用该库为特定的URL添加一些处理程序,并根据需要生成和提供动态数据。 它还具有安全性目标(对SSL的支持),因此您只需专心

    C++网络服务开发套件0.5.5

    CWSS: C++ Web Services Server <br>1. 目的: 利用C++语言的高效, 稳定和灵活性,创建一个通用的通讯平台; 服务器端以插件配置方式动态加入功能组件; 客户端以XML文本描述方式, 调用服务端功能组件的函数;...

    WebsocketPP C++构建Web服务器源代码

    https://blog.csdn.net/mfcing/article/details/50118591 这个博客的代码,很简单。主要多线程这个比较好,可以好好研究。如果行可以用于pc的服务器。

    c++mongoose 实现httpserver,httpclient

    使用mongoose实现了httpserver,httpclient,websocketserver

Global site tag (gtag.js) - Google Analytics