65.9K
CodeProject 正在变化。 阅读更多。
Home

Web 服务:从初学者角度看

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (30投票s)

2013年2月28日

CPOL

8分钟阅读

viewsIcon

117432

本文旨在深入探讨什么是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。Smile | :)  

粗体代码行展示了我们如何通过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服务器发送HTTPHTTPS请求,并将服务器响应数据直接加载回脚本。

在此实现中,我们将使用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项目,不得不学习它们,你懂的。现在我知道它们非常有用。Smile | :)  

嗯,在这个主题下,我并没有真正成功找到一个适合初学者(包括我)的优秀资源,因此决定写下一些东西。

CP上的第一篇文章……Smile | :) 欢迎评论和批评。请不要太在意格式,我排版很费劲……:P

历史

2013年2月28日,版本1.0

© . All rights reserved.