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

关于作者

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
支持传统C++开发及运行的跨平台Web服务器端环境,建立在Apache平台上,knewcode0.91a版。 测试运行:(测试环境,Windows7) 1、将本目录拷贝到D盘根目录;(如果需要拷贝到其他目录,请自行修改Apache的配置文件“debug\httpd-2.2.25-win32\Apache22\conf\httpd.conf”) 2、运行“D:\knewcode0.91a\StartDebug.bat”启动Apache及knewcode运行环境; 3、在浏览器,输入“http://127.0.0.1:8090/hello_world.kc”,测试“hello_world_cpp”例子; 4、在浏览器,输入“http://127.0.0.1:8090/”,测试“exam_blog”例子; 5、“D:\mycode\knewcode\release\0.91a\sample\src\webservice_client(c#)”是C#的Webservice客户端例子。 Linux下安装:(目前只在Ubuntu14.04 32位版下测试通过,目前只支持32位版的Linux) 1、将本目录拷贝到“/home”目录下;(如果需要拷贝到其他目录,请自行修改“kc_apache_mod.conf”和“kc_apache_mod.load”文件) 2、使用超级管理员权限,运行“/home/knewcode0.91a/debug/linux_apache_setup/setup.sh”脚步,拷贝2个配置文件到Apache环境下; 3、修改Apache的相关配置文件,将“/home/knewcode0.91a/sample”目录设置为Apache的主页目录,并设置权限; 4、修改目录权限,设置“/home/knewcode0.91a”目录为可运行和可读写,“/home/knewcode0.91a/sample”目录的所有者改为“www-data”。 目前处于测试阶段,如遇任何问题,请反馈到如下邮箱,谢谢! zogy@163.com
支持传统C++开发及运行的跨平台Web网站服务器端环境,建立在Apache平台上,knewcode0.93a版。 测试运行:(测试环境,Windows7) 1、将本目录拷贝到D盘根目录;(如果需要拷贝到其他目录,请自行修改Apache的配置文件“debug\httpd-2.2.25-win32\Apache22\conf\httpd.conf”) 2、运行“D:\knewcode0.93a\StartDebug.bat”启动Apache及knewcode运行环境; 3、在浏览器,输入“http://127.0.0.1:8090/hello_world.kc”,测试“hello_world_cpp”例子; 4、在浏览器,输入“http://127.0.0.1:8090/”,测试“exam_blog”例子; 5、“D:\knewcode0.93a\sample\src\webservice_client(c#)”是C#的Webservice客户端例子,可直接运行“webservice_client.exe”测试。 Linux下安装:(测试环境,Ubuntu14.04 32位版) 1、将本目录拷贝到“/home”目录下;(如果需要拷贝到其他目录,请自行修改“kc_apache_mod.conf”和“kc_apache_mod.load”文件) 2、使用超级管理员权限,运行“/home/knewcode0.93a/debug/linux_apache_setup/setup.sh”脚本,拷贝2个配置文件到Apache环境下; 3、修改Apache的相关配置文件,将“/home/knewcode0.93a/sample”目录设置为Apache的主页目录,并设置权限; 4、修改目录权限,设置“/home/knewcode0.93a”目录为可运行和可读写,“/home/knewcode0.93a/sample”目录的所有者改为“www-data”; 5、目前只在Ubuntu14.04 32位版下测试过,其他版本Linux请自行验证,并反馈问题给我,谢谢;目前只支持32位版的Linux。 系统目前尚处于测试阶段,如遇任何问题,请反馈到如下邮箱,谢谢! zogy@163.com ******************************************************************************************** 2015-11-11:knewcode0.93a版 1、增加print的简化关键字“p”; 2、增加“exec”关键字,用于执行自定义脚本; 3、字符串增加用2个双引号表示1个双引号的转义字符; 4、增加变量定义的“--ref--”选项,用于定义同名外部变量的引用(如无对应的外部变量,则重新定义一个); 5、增加“delay”关键字,用于延迟脚本在特定的位置执行; 6、增加变量定义的“--static--”选项,防止重复定义的变量被覆盖; 7、修复了一些,在负载测试,因高并发的进程或线程,引起的系统崩溃的bug; 8、修复了db_action和so_session应用的一些内存泄漏等的bug。 2015-09-21:knewcode0.92a版 增加信号处理,降低因段错误,浮点错误,除0错误等异常,引起的系统崩溃。 2015-09-14:knewcode0.91a版 初始版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值