第12章 Web Service
本章视频教学录像:20 分钟
Web Service 是一种新的Web应用程序分支,是自包含、自描述和模块化的应用,可以发布、定位和通过Web调用。
Web服务的工作方式就像能够跨Web调用的组件。ASP.NET允许创建Web服务。在本章中,主要讲解如何创建Web服务以及如何使用Web服务作为Web应用程序中的组件。
本章要点(已掌握的在方框中打钩)
□ 了解Web Service
□ Web 服务代码隐藏文件
□ 使用 Visual Studio 2010 创建 Web Service
□ 调用 Web Service
12.1 Web Service简介
本节视频教学录像:4分钟
Web Service即Web服务。所谓服务就是系统提供一组接口,并通过接口使用系统提供的功能。与在Windows系统中的应用程序通过API接口函数使用系统提供的服务一样,在Web站点之间,如果使用其他站点的资源,就需要其他站点提供服务,这个服务就是Web服务。
Web服务是建立可互操作的分布式应用程序的新平台,它是一套标准,定义了应用程序如何在Web上实现互操作。在这个新的平台上,开发人员可以使用任何语言,以及在任何操作系统平台上进行编程,只要保证遵循Web服务标准,就能够实现对服务进行查询和访问。Web服务的服务器端和客户端都需要支持标准协议HTTP、SOAP和XML。
网络是多样性的,要在Web的多样性中取得成功,Web服务在涉及操作系统、对象模型和编程语言的选择时不能有任何倾向性。并且,要使Web服务像其他基于Web的技术一样被广泛采用,还必须满足以下特性。
⑴服务器端和客户端的系统都是松耦合的。也就是说,Web服务与服务器端和客户端所使用的操作系统和编程语言都无关。
⑵Web服务的服务器端和客户端应用程序具有连接到Internet的能力。
⑶用于进行通信的数据格式必须是开放式标准,而不是封闭通信方式。在采用自我描述的文本消息时,Web服务及客户端无需知道每个基础系统的构成即可共享消息,这使得自治系统和不同的系统之间能够进行通信。Web服务使用XML实现此功能。
Web Services 是指用于架构 Web service 的整体技术框架,而 Web Service 则是使用 Web Services技术而创建的应用实例。在很多时候,Web Services的含义也是具体的应用实例,只不过此时泛指。
在ASP.NET中创建一个Web服务与创建一个网页相似。但是Web服务没有用户界面,也没有可视化组件,并且Web服务仅包含方法。Web服务可以在一个扩展名为.asmx的文件中编写代码,也可以放在代码隐藏文件中。在Visual Studio 2010中,.asmx文件的隐藏文件创建在App_Code目录下。
Web服务文件中包括一个WebServices指令,该指令必须应用在所有Web服务中。语法代码如下:
<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service"%>
其中,
Language 属性:指定在 Web services 使用的语言。可以为 .NET 支持的任何语言,包括 C#、Visual Basic和JScript。该属性是可选的,如果未设置该属性,编译器将根据类文件使用的扩展名推导出所使用的语言。
Class属性:指定实现Web services的类名,该服务在更改后第一次访问Web services时被自动编译。该值可以是任何有效的类名。该属性指定的类既可以存储在单独的代码隐藏文件中,也可以存储在与Web Service指令相同的文件中。该属性是Web services必需的。
CodeBehind属性:指定Web services类的源文件的名称。
Debug属性:指示是否使用调试方式编译Web services。如果启用调试方式编译Web services, Debug属性则为true,否则为false。默认为false。在Visual Studio 2010中,Debug属性是由Web config文件中的一个输入值决定的,所以开发Web services时,该属性会被忽略。
12.2 Web Service服务代码隐藏文件
本节视频教学录像:7分钟
在代码隐藏文件中包含一个类,它是根据Web服务的文件名命名的。这个类有两个特性标签, Web Service和Web Service Binding。在该类中还有一个名为Hello World的模板方法,它将返回一个字符串。这个方法使用Web Method特性修饰,该特性表示方法对于Web服务使用程序可用。
1.Web Service特性
对于将要发布和执行的Web服务来说,Web Service特性是可选的。可以使用Web Service特性为Web服务指定不受公共语言运行库标识符规则限制的名称。
Web服务在成为公共之前,应该更改其默认的 XML 命名空间。每个 XML Web services 都需要唯一的XML命名空间来标识它,以便客户端应用程序能够将它与网络上的其他服务区分开来。http://tempuri.org/可用于正在开发中的Web服务,已发布的Web服务应该使用更具永久性的命名空间。例如,可以将公司的Internet域名作为XML命名空间的一部分。虽然很多Web服务的XML命名空间与URL很相似,但是,它们无需指向Web上的某一实际资源(Web服务的XML命名空间是URI)。对于使用ASP.NET创建的Web服务,可以使用Namespace属性更改默认的XML命名空间。
例如:将Web Service特性的XML命名空间设置为http://www.microsoft.com。代码如下:
using System;
using System.Web.Services;
[WebService(Namespace ="http:// www.microsoft. com /")]
public class Service : System.Web.Services.WebService
{
public Service () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
}
2.Web Service Binding特性
按Web服务描述语言(WSDL)的定义,绑定类似于一个接口,原因是它定义一组具体的操作。每个Web services方法都是特定绑定中的一项操作。Web services方法是Web services默认绑定的成员,或者是在应用于实现Web services的类的Web Service Binding特性中指定绑定的成员。Web服务可以通过将多个Web Service Binding特性应用于Web services来实现多个绑定。
3.Web Method特性
Web services类包含一个或多个可在Web服务中公开的公共方法。这些Web services方法以Web Method特性开头。为使用ASP.NET创建的Web服务中的某个方法添加此Web Method特性后,就可以从远程Web客户端调用该方法。
Web Method特性包括一些属性,这些属性可以用于设置特定Web方法的行为,语法如下:
[Web Method(PropertyName=value)]
Web Method特性提供以下属性。
Buffer Response属性:Buffer Response属性启用对Web services方法响应的缓冲。当设置为true时,ASP.NET在将响应从服务器向客户端发送之前,对整个响应进行缓冲。当设置为false时,ASP. NET以16KB的块区缓冲响应。默认值为true。
Cache Duration属性:Cache Duration属性启用对Web services方法结果的缓存。ASP.NET将缓存每个唯一参数集的结果。该属性的值指定ASP.NET应该对结果进行多少秒的缓存处理。值为0时,则禁用对结果进行缓存。默认值为0。
Description属性:Description属性提供Web services方法的说明字符串。当在浏览器上测试Web服务时,该说明将显示在Web服务帮助页上。默认值为空字符串。
Enable Session属性:Enable Session属性设置为true,启用Web services方法的会话状态。一旦启用,Web services 就可以从 HttpContext.Current.Session中直接访问会话状态集合,如果它是从Web Service基类继承的,则可以使用Web Service.Session属性来访问会话状态集合。默认值为false。
Message Name属性:Web服务中禁止使用方法重载。但是,可以通过使用Message Name属性消除由多个相同名称的方法造成的无法识别问题。Message Name属性使Web服务能够唯一确定使用别名的重载方法。默认值是方法名称。当指定Message Name时,结果SOAP消息将反映该名称,而不是实际的方法名称。
12.3 使用Visual Studio 2010创建Web Service
本节视频教学录像:3分钟
下面通过一个简单的例子介绍如何使用Visual Studio 2010创建Web服务。
【范例12-1】创建简单的Web服务。
本示例将介绍如何创建一个简单的Web服务。程序实现的主要步骤如下。
⑴打开Visual Studio 2010开发环境,依次选择【文件】【新建】【asp.net空网站】命令,并将网站命名为WebDemo1,在解决方案资源管理器中右键单击项目名称,依次点击【添加新项】【Web服务】命令,这里直接使用默认的web服务文件名,默认名为WebService.asmx如下图所示。
⑵单击“确定”按钮,将显示如图所示的页面。
该页为Web服务的代码隐藏文件,它包含了自动生成的一个类,并生成一个名为Hello World的方法,返回一个字符串。
⑶在代码中添加自定义的方法,包括+、-、*、/四种运算,代码如下。
01 [WebMethod(Description=“求和的方法”)]
02 public double addition(double i,double j)
03 {
04 return i+ j;
05 }
06 [WebMethod(Description=“求差的方法”)]
07 public double subtract(double i,double j)
08 {
09 return i - j;
10 }
11 [WebMethod(Description=“求积的方法”)]
12 public double multiplication(double i,double j)
13 {
14 return i * j;
15 }
16 [WebMethod(Description=“求商的方法”)]
17 public double division(double i,double j)
18 {
19 if (j != 0)
20 return i / j;
21 else
22 return 0;
23 }
24 }
⑷按【F5】键调试运行,或单击工具栏中的按钮,即可在浏览器中显示如图所示的结果。
⑸点击【Addition】并输入相应的数字,点击【调用】可得到XML格式的求和结果。
关于-、*、/,读者可自行调用并尝试,此处不再赘述。
12.4 调用Web Service
本节视频教学录像:4分钟
上节内容只是简单地创建了Web service,创建完Web服务,并且对Internet上的使用者开放,发现哪些方法可用,还要创建客户端代理,并将代理合并到客户端中。这样,客户端就可以如同调用本地服务一样使用Web服务。实际上,客户端应用程序通过代理实现本地方法调用,就好像它通过Internet直接调用Web服务一样。
下面将演示如何创建一个Web应用程序来调用Web服务。该示例将调用例12-1中创建的Web服务。
【范例12-2】调用Web服务。
本实例将介绍如何使用已经存在的Web服务。执行程序,示例运行结果如图所示。
程序实现的主要步骤如下。
⑴打开Visual Studio 2010开发环境,依次选择【文件】【新建】【asp.net空网站】命令,并将网站命名为WebDemo2。
⑵在解决方案资源管理器中右键单击网站名,单击【添加Web引用】,出现如图所示的界面。
⑶单击【本地计算机上的Web服务】,出现如图所示的界面。
⑷单击【WebService】,出现如图所示的界面。
这里需要说明的是,本例主要实现调用本地计算机上的Web服务,所以单击【本地计算机上的Web服务】链接,将在【添加Web引用】对话框中显示在本地计算机上的可用的Web服务和发现文档,另外需要注意的是本程序的调用需要配置IIS,IIS配置不正确将直接导致本程序的失败,具体可参考本书1.2.1小节。
Web引用默认名为localhost,这里直接单击【添加引用】之后,解决方案资源管理器中出现如图所示的引用。
⑸为WebDemo2添加一个Web窗体,使用默认名称Default.aspx。切换到页面的源视图,代码如下。
01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%>
02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
03 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
04 <html xmlns="http://www.w3.org/1999/xhtml">
05 <head id="Head1" runat="server">
06 <title>无标题< /title>
07 < /head>
08 <body>
09 <form id="form1" runat="server">
10 <div>
11 <asp:TextBox ID="Num1" runat="server">< /asp:TextBox>
12 <select id="selectOper" runat= "server">
13 <option>+< /option>
14 <option>-< /option>
15 <option>*< /option>
16 <option> /< /option>
17 < /select>
18 <asp:TextBox ID="Num2" runat="server">< /asp:TextBox>
19 <asp:Button ID="Button1" runat="server" Text="=" onclick="Button1_Click" />
20 <asp:TextBox ID="Result" runat="server">< /asp:TextBox>
21 < /div>
22 < /form>
23 < /body>
24 < /html>
然后在后台写调用的代码,调用之前和使用其他的对象一样,要先实例化,实例化的方法是localhost.WebService a = new localhost.WebService();然后就可以通过a来访问WebService里面提供的方法了。在这个例子里面,动态地创建了一个button控件来触发WebService的调用,后台代码如下。
01 public partial class _Default :System.Web.UI.Page
02 {
03 protected void Page_Load(object sender,EventArgs e)
04 {
05 }
06 protected void Button1_Click(object sender,EventArgs e)
07 {
08 string selectFlag= selectOper.Value;
09 localhost.WebService web= new localhost.WebService();
10 if (selectFlag.Equals("+"))
11 {
12 Result.Text = (web.addition(double.Parse(Num1.Text), doub13 le.Parse(Num2.Text))).ToString();
14 }
15 else if (selectFlag.Equals("-"))
16 {
17 Result.Text = (web.subtract(double.Parse(Num1.Text), doub18le.Parse(Num2.Text))).ToString();
19 }
20 else if (selectFlag.Equals("*"))
21 {
22 Result.Text=(web.multiplication(double.Parse(Num1.Text),double.Parse(Num2.Text))).ToString();
23 }
24 else if (selectFlag.Equals("/"))
25 {
26 Result.Text= (web.division(double.Parse(Num1.Text),double.Parse(Num2.Text))).ToString();
27 }
28 }
29 }
【运行结果】
按【F5】键运行,输入相应的数值,选择相应的运算,单击按钮即可得到运算结果,如图所示。
12.5 高手点拨
本节视频教学录像:2分钟
WinForm调用Web Services
我们创建的Web服务,不但在Web项目中可以调用,对于WinForm应用程序也可以调用,调用的基本方法为:添加服务引用高级添加Web引用填写url添加Web引用。具体视项目情况而定。
12.6 实战练习
创建一个简单的Web服务,要求输入一个字符串,返回反向字符串,并创建Web客户端程序调用此功能。