【IT168技术文档】
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; } }