Web 服务:从初学者角度看






4.50/5 (30投票s)
本文旨在深入探讨什么是Web服务、如何创建Web服务以及如何在各种场景中调用和使用它们。
引言
Web服务:顾名思义,Web服务是一个实体或一段代码,托管在Web上,用于特定目的。这可能是最简单的定义。
更恰当的版本可能是:Web服务是软件应用程序的一部分,托管在Web上,执行特定功能以实现业务逻辑。
此外,Web服务允许一个网站与其他网站进行交互,无论网站是用何种编程语言编写的,也无论机器的硬件和操作系统如何。
我们来举个例子:假设你是一名开发人员,手下有3个不同的数学网站,都是不同客户要求的。这3个网站需要实现一个共同的功能,比如在一个文本区域中显示斐波那契数列。
这里出现的问题是,你是否会编写三段独立的代码来实现相同的功能?如果尝试这种方法,那将是多余的额外工作。这时,Web服务的需求就出现了。只需在Web服务中编写一次显示斐波那契数列的功能,然后在3个不同的网站中调用此Web服务即可。这样就完成了。你无需重复编写相同的代码。
这里可能会出现一个问题:为什么现在是Web服务?以前情况如何?人们能否将一个应用程序的功能用于另一个应用程序?
答案是肯定的,人们能够做到。以前有COM(组件对象模型)、DCOM(分布式组件对象模型)等技术有助于实现这种利用,但它们也有局限性。事实上,它们必须在每个用户的机器上显式注册,因此可能会出现注册表故障等问题。
Web服务克服了所有这些限制。
本文的目的是让读者理解什么是Web服务(我已在引言部分尝试说明),以及“如何创建Web服务并使用不同的方法调用和使用它们?”。后者将在后续章节中讨论。敬请期待……
背景
我属于.NET领域,本文中的代码文件针对.NET 3.5,因此唯一的前置条件是安装Visual Studio 2008客户端。
使用代码
让我们开始创建Web服务。
1) 打开Visual Studio 2008客户端。点击新建>网站>ASP.NET Web服务。选择你想要放置代码的路径。请参阅下面的截图。
2) Visual Studio将打开一个默认的Service.cs文件,你可以在其中编写你的方法。编写以下代码行。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
[WebService(Namespace= "http://tempuri.org/")]
[WebServiceBinding(ConformsTo= WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
//
[System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
public Service ()
{
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
public int Area(int l, int b)
{
return l * b;
}
[WebMethod]
public int Perimeter(int l, int b)
{
return 2 * (l +b);
}
}
3) 构建解决方案并在浏览器中查看Service.asmx文件。它会是下面这个样子:
4) 如果点击“面积”和“周长”链接,创建的Web方法将显现并通过HTTP POST方法调用。
就这样,一个非常基本的Web服务已经编码并创建完成,它将帮助我们计算矩形的面积和周长。
你可能想复制Web服务URL,因为它们稍后将在文章中使用。
接下来,我们将看看如何在需要时调用和使用Web服务。
根据不同的场景,调用Web服务可能有三种方法。
1) 通过HTTP POST方法。
2) 通过创建代理类
3) 通过使用基于SOAP的XMLHTTP Request对象
让我们简要讨论一下每种方法:
HTTP POST方法:此方法可以直接通过从客户端调用.asmx文件来使用。
执行HTTP POST方法最有利的方法是将代码放在HTML文件中。我们开始实现它。
打开记事本,并在其中写入以下代码行
<html>
<head>
<title>WebService Call using HTTP POST</title>
<body>
<form action="https://:43529/WebService/Service.asmx/Area" method="POST">
<input name="l">
<input name="b">
<input type="submit" value="Click for Area">
</form>
<form action="https://:43529/WebService/Service.asmx/Perimeter" method="POST">
<input name="l">
<input name="b">
<input type="submit" value="Click for Perimeter">
</form>
</body>
</head>
</html>
友情提醒,你可能需要将上述代码中的Web服务URL更改为你自己之前复制的URL。
粗体代码行展示了我们如何通过HTTP POST单独调用Web服务的方法。将上述代码行保存为.html并执行后,将导致浏览器操作。
W
当点击“点击计算面积”或“点击计算周长”按钮时,我们将看到Web服务的特定方法被调用,结果以XML的形式呈现。
HTTP POST方法的一个限制可能是:我们无法构建以复杂类型作为参数或返回值的Web方法。
2) 创建代理类:这种方法被开发人员广泛使用。它实际上充分利用了Web服务的潜力。让我们实现它并看看它的奇妙之处。
我们需要创建一个ASP.NET网站来查看和实现此方法。
再次打开Visual Studio,点击新建>网站>ASP.NET网站。选择你想要放置代码的路径。
这个网站创建将打开一个Default.aspx页面、它的aspx.cs页面、一个App_Code文件夹以及其他一些东西。
打开Default.aspx页面并按照以下截图进行设计
它基本上是4个ASP标签控件、4个ASP文本框控件和1个ASP按钮,绑定在一个div下。
现在,这种方法最重要的方面开始发挥作用:添加之前创建的Web服务。
右键单击项目并点击“添加Web引用”。点击后将打开一个类似于下面截图的对话框。
现在,我们需要在这里捕获Web服务,可以通过添加URL或通过浏览给出的各种选项。成功添加Web服务将显示“在此URL找到Web服务”。您将看到您实际创建的方法。您可能希望将Web引用的名称从“localhost”更改为其他名称,以避免混淆等问题。点击“添加引用”即可。您已成功将Web引用添加到您的ASP.NET网站。
解决方案资源管理器将显示如下:
现在,一旦添加了Web引用,我们就可以在代码后端编写一些代码来使用Web服务了。
打开 Default.aspx.cs 文件,在按钮点击事件中添加以下代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partialclass_Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnClick_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(txtLength.Text) && !string.IsNullOrEmpty(txtBreadth.Text))
{
Maths.Service obj = new Maths.Service();
int l = Convert.ToInt32(txtLength.Text);
int b = Convert.ToInt32(txtBreadth.Text);
txtArea.Text = Convert.ToString(obj.Area(l, b));
txtPerimeter.Text = Convert.ToString(obj.Perimeter(l, b));
}
}
}
现在,让我进一步解释上面的代码。粗体代码行就是此方法的全部,即创建代理类。
我们正在创建一个添加的Web服务对象,然后使用该对象调用Web服务的各个方法。其余代码一目了然,它将计算矩形的面积和周长。
构建解决方案并在浏览器中查看Default.aspx文件。
输入长度和宽度的值,然后点击按钮。
您将看到面积和周长显示在放置的文本框中。
类似的截图如下。


我们看到,通过这种方法,我们只需添加Web引用并创建代理类,即可调用Web服务,而无需在当前项目中编写所需的功能(由Web服务完成)。
1) 通过使用基于SOAP的XMLHTTP请求对象:
首先让我们看看什么是SOAP。
SOAP(简单对象访问协议)是一种用于消息传递的协议,完全基于XML。
SOAP提供了一套完整的消息规则,以及消息编码、消息处理等实体的规则。
SOAP消息的语法如下
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
</soap:Body>
</soap:Envelope>
SOAP消息被称为Envelope,它进一步包含Header和Body标签。
Header标签是可选的,而Body标签是发送消息时必须使用的。
现在,让我们看看XMLHttpRequest到底是什么。
XMLHttpRequest规范定义了一个API,该API提供了客户端脚本功能,用于在客户端和服务器之间传输数据。
它用于直接向Web服务器发送HTTP或HTTPS请求,并将服务器响应数据直接加载回脚本。
在此实现中,我们将使用HTML表单和JavaScript函数来演示此方法的全部潜力。
a) 首先,我们将创建一个XMLHttpRequest对象。请参阅以下代码行。
var sample;
if (window.XMLHttpRequest)
{
sample= new window.XMLHttpRequest;//For browsers other than IE
}
else
{
try
{
sample=new ActiveXObject("MSXML2.XMLHTTP.3.0"); //for IE
}
catch(ex)
{
}
}
b) 现在,我们将使用XMLHttpRequest的Open方法设置Web服务URL。
sample.open ("POST",”https://:43529/WebService/Service.asmx",true);
基本上 XMLHttpRequest 的 Open 方法有 5 个参数
HTTP方法类型、URL、布尔值(大多数情况下为true)、 用户名和密码(可选)。
c) 现在,我们将创建请求头和SOAP请求(如下面代码所示)。
d) 演示将主要通过HTML代码完成。因此,打开你的记事本并键入以下代码:
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript" >
var sample;
if (window.XMLHttpRequest)
{
sample = new window.XMLHttpRequest;
}
else
{
try
{
sample = new ActiveXObject("MSXML2.XMLHTTP.3.0");
}
catch (ex)
{
}
}
sample.open("POST", "https://:43529/WebService/Service.asmx",true);
sample.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
sample.setRequestHeader("SOAPAction", "http://tempuri.org/Area");
strRequest = "<?xml version='1.0' encoding='utf-8'?>";
strRequest = strRequest + "<soap:Envelope " +"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +"xmlns:xsd='http://www.w3.org/2001/XMLSchema' " +"xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>";
strRequest = strRequest + " <soap:Body>";
strRequest = strRequest + "<Area xmlns='http://tempuri.org/'><l>4</l><b>5</b></Area>";
strRequest = strRequest + "</soap:Body>";
strRequest = strRequest + "</soap:Envelope>";
sample.onreadystatechange = function () {
if (sample.readyState == 4 &&xmlHTTP.status == 200)
{
alert(xmlHTTP.responseXML.xml);
}
}
sample.send(strRequest);
</script>
</head>
<body>
</body>
</html>
e) 将记事本保存为.html扩展名并 执行以在浏览器中查看。
浏览器将以JavaScript警告框的形式给出输出,类似于下面。
SetRequestHeader创建SOAP消息的Header标签,而XMLHTTPRequest对象的OnReadyStateChange属性协助我们在处理完Web服务的响应后执行代码。
兴趣点
最初我以为Web服务、WCF之类的东西都是天外来物,完全不感兴趣。
后来我接手了一个涉及Web服务、WCF服务等的.NET项目,不得不学习它们,你懂的。现在我知道它们非常有用。
嗯,在这个主题下,我并没有真正成功找到一个适合初学者(包括我)的优秀资源,因此决定写下一些东西。
CP上的第一篇文章…… 欢迎评论和批评。请不要太在意格式,我排版很费劲……:P
历史
2013年2月28日,版本1.0