在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/&quot>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 application
int _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服务。现在为何不试试程序对程序的整合?

时间: 2024-11-18 22:20:37

在C++中创建并使用Web服务的相关文章

Visual Studio 中创建一个智能项目,在智能项目下创建的窗体中,怎么调用web服务中的方法!!!求解

问题描述 VisualStudio中创建一个智能项目,在智能项目下创建的窗体中,怎么调用web服务中的方法!!!求解VisualStudio中创建一个智能项目,在智能项目下创建的窗体中,怎么调用web服务中的方法!!!求解 解决方案 解决方案二:引用中添加服务引用.找到服务地址.解决方案三:引用1楼chen_ya_ping的回复: 引用中添加服务引用.找到服务地址. 顶楼上,希望遇见问题,先搜索一下,更能提高自己

用ASP.NET创建管理XML WEB服务全接触

asp.net|web|web服务|xml|创建 Internet的发展已经用它超乎想象的力量重新规划了应用程序开发领域.公司和机构越来越依赖因特网和有关技术提供的数字资源和通讯渠道.因而,现在设计和开发的应用程序很少不考虑如何最好的整合和运用Internet技术.在应用程序中整合Internet技术成为业界对开发技术的提出的新的要求.微软适时提出的以XML为基础的Web服务满足了这种需求,本期专题我将向大家介绍利用ASP.NET的创建和管理XML WEB服务的过程. 概述 XML Web服务是

怎样在J2EE组件中引用和查找Web服务

j2ee|web|web服务 本文将讨论怎么在J2EE组件中引用Web服务.并且通过JNDI来查找Web服务.在内容组织上,首先把一个EJB2.1无状态会话Bean发布成Web服务,然后开发基于JSP的Web服务客户端,最后着重介绍怎么在JSP的部署时引用Web服务,并且讨论怎么通过JNDI来查找和调用Web服务.阅读本文前您需要以下的知识和工具:J2EE1.4 SDK,并且会初步使用:掌握基本的JAX-RPC Web服务开发技能:了解JNDI的基本知识,能够使用它进行简单编程:一般的Java编

如何创建和使用Web服务

web|web服务|创建 简介 .NET最强大的一个方面之一就是可以利用它创建Web服务.一个Web服务就是一个网站所提供的供其它网站调用的外部接口.举个例子来说,某个金融公司可以为与它的贸易伙伴通过Web服务提供详细的股票报价,这些信息可以是通过Web页面进行读取和显示的,也可以是从客户的桌面电脑的应用程序里读取的. 本文就对Web服务的其中两个方面进行说明:一是如何创建Web服务:二是如何使用Web服务.作为例子,我们以来自ASPFAQs.com(http://www.aspfaqs.com

web开发-myEclipse中创建新的web project会在工程名上报错

问题描述 myEclipse中创建新的web project会在工程名上报错 开发-myEclipse中创建新的web project会在工程名上报错-myeclipse webproject"> 如图所示,只有在项目名称的上面会有一个错误表示.但是程序可以正常运行. 如果不管这个会不会有什么问题? 解决方案 有错误提示就是有错误了,如果找不到的话,我个人认为是JDK的问题,看你那里是用[myelcipse7.1]的JRE,可以改为jdk6,具体操作:右击JRE System librar

火狐中js怎样调用web服务,解决送100分

问题描述 火狐中js怎样调用web服务?IE中调用正常失败的信息如下:状态码:0服务器方法**失败.最好把思路帮我分析下,谢谢! 解决方案 解决方案二:js调用的服务是指webservice服务不?可以利用微软HTC组件.js调用HTC,HTC调用webservice解决方案三:帮顶..学习解决方案四:还有一个例子JS调用WS解决方案五:JS调用后台事件IEFFFirefox在页面里面加入一下html代码HTMLcode<inputtype="hidden"name="

在ASP.NET开发中使用非.Net Web服务

asp.net|web|web服务 对于如何使用 WebRequest 和 WebResponse 类在 URI 上生成 POST 请求,在微软的 .Net 快速入门教程中有详细的描述(http://chs.gotdotnet.com/quickstart/howto/doc/WebRequests/clientPOST.aspx),简要引用如下: WebResponse 类是抽象(在 Visual Basic 中为 MustInherit)基类,协议特定的响应类从该抽象基类派生.应用程序可以使

在Apache Geronimo应用程序中实现和部署Web服务

现在,无论您的企业应用程序是部署在小型家庭商店中,还是跨多个领域的企 业基础设施的一部分,无论应用程序是否与他人协作,它都必须支持 Web 服务. 途径 现代企业往往是非常复杂的系统,每天要面对许多机会和挑 战.许多机会涉及到与其他系统和企业进行集成或协作.因此,明智的企业应用 程序开发人员要确保别的应用程序可以轻松地访问自己的应用程序.Web 服务就 是提供这种可访问性的好方式. Apache Geronimo 应用服务器支持 Web 服务以及最新 Java 2 Platform, Enter

在 ASP.NET 开发中使用非 .Net Web 服务

asp.net|web 对于如何使用 WebRequest 和 WebResponse 类在 URI 上生成 POST 请求,在微软的 .Net 快速入门教程中有详细的描述(http://chs.gotdotnet.com/quickstart/howto/doc/WebRequests/clientPOST.aspx),简要引用如下: WebResponse 类是抽象(在 Visual Basic 中为 MustInherit)基类,协议特定的响应类从该抽象基类派生.应用程序可以使用 WebR