工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > C/C++ > 正文
在C++中创建并使用Web服务
[文章信息]
作者:Kate Gregory
时间:2005-02-17
出处:天极blog
责任编辑:方舟
[文章导读]
web服务的确是.net中让人激动的部分——但它们本身比.net要大
advertisement
热点推荐
· 真没想到VB也可以这样用之指针技术
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
[正文]
  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服务。现在为何不试试程序对程序的整合?

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 利用C++模板编写的序列化框架
  • C语言高效编程的的四大绝招
  • C++高质量编程点滴
  • C++中用vectors改进内存的再分配
  • C++中用函数模板实现和优化抽象操作
  • 联想IBM联姻照旧 配合国会调查不误正式合并
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索