用 ASP.NET AJAX 调用Web 服务
Web服务是 .NET 框架的一个组成部分,为分布式系统之间的数据交换提供跨平台的解决方案。Web 服务常用于不同操作系统、对象模型和编程语言的数据发送和接收,也可用于向ASP.NET AJAX 页面中动态注入数据,或从页面向后端系统发送数据。上述所有操作都无需执行回传。
尽管通过 ASP.NET AJAX UpdatePanel控件可以方便地在任意ASP.NET 页面上启用AJAX,但有时您可能需要不通过UpdatePanel 就能动态访问服务器上的数据。本文档将介绍如何通过在ASP.NET AJAX页面中创建和使用 Web 服务达到这一目的。
本文档将重点介绍核心 ASP.NET AJAX Extensions的可用功能,以及ASP.NET AJAX Toolkit中一个启用了Web 服务、名为AutoCompleteExtender的控件。内容包括定义启用了AJAX 的Web 服务、创建客户端、以及用JavaScript 调用 Web 服务。另外我们还将学习如何直接向ASP.NET 页面方法发起 Web 服务调用。
Web服务配置用 Visual Studio 2008 Beta 2创建一个新网站项目时,web.config 文件中有很多新内容。使用Visual Studio 前期版本的用户可能对这些内容不甚了解。这些更改内容中有一部分将asp 前缀映射到ASP.NET AJAX 控件中,以便在页面中使用这些控件,还有一些内容用于定义所需的HttpHandler 和 HttpModule。程序列表 1 列出了对 web.config 中的 <httpHandlers> 元素所做的、影响Web 服务调用的更改内容。移除了用于处理.asmx 调用的默认 HttpHandler,取而代之的是位于System.Web.Extensions.dll 程序集中的 ScriptHandlerFactory 类。System.Web.Extensions.dll 包含ASP.NET AJAX 使用的所有核心功能。
程序列表1. ASP.NET AJAX Web服务处理器配置
求消息传递了一个值为Belgium 的国家参数,而程序列表3 中的响应消息则传递了一个Customer 对象数组及其关联属性。
<httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpHandlers>
程序列表2.序列化为JSON格式的Web服务请求消息
下面将介绍如何创建能处理JSON请求消息并能用简单或复杂类型进行回应的 Web 服务。
创建启用了 AJAX 的 Web 服务ASP.NET AJAX 框架提供了多种调用 Web 服务的方法。您可以使用AutoCompleteExtender控件(在 ASP.NET AJAX 工具箱中)或JavaScript 来达到这一目的。但在调用服务之前,必须为该服务启用AJAX,以使它能被客户端脚本代码所调用。
无论您是否熟悉 ASP.NET Web 服务,您都将发现创建并启用AJAX 的服务都很简单。.NET 框架 自 2002 年首次发布起就支持创建ASP.NET Web 服务。而ASP.NET AJAX Extensions 也额外提供了建立于.NET 框架默认的特性集基础上的AJAX 功能。Visual Studio .NET 2008 Beta 2 内含对创建 .asmx Web 服务文件的支持,并自动从System.Web.Services.WebService 类继承了关联的 code beside 类。向这个类添加方法时,必须为方法应用 WebMethod 属性,以使它们能为 Web 服务使用者所调用。
程序列表 4 将 WebMethod 属性应用于一个名为GetCustomersByCountry()的方法:
程序列表4.在Web服务中使用 WebMethod属性
GetCustomersByCountry()方法接受了一个国家参数,并返回一个 Customer 对象数组。传递到方法中的国家值被转发到一个业务层类,后者又调用一个数据层类以便从数据库中检索数据、用数据填充Customer对象属性并返回数组。
使用 ScriptService 属性虽然添加 WebMethod 属性允许向 Web 服务发送标准 SOAP 消息的客户端调用GetCustomersByCountry()方法,但这并不能允许从外部的ASP.NET AJAX应用程序调用 JSON。要允许JSON 调用,必须对 Web 服务类应用 ASP.NET AJAX Extension 的 ScriptService 属性,这样使 Web 服务能发送使用了 JSON 格式的响应消息,并允许客户端侧脚本通过发送JSON消息来调用服务。
程序列表 5 的示例是为一个名为CustomersService的Web 服务类应用ScriptService 属性。
程序列表5.在启用AJAX的Web服务中使用 ScriptService属性
ScriptService 属性作为表示可从 AJAX 脚本代码调用的标记。它并不真的处理任何后台的JSON 序列化或反序列化任务。绝大部分的JSON 处理任务由 ScriptHandlerFactory (在web.config 中配置)及其他相关类完成。
ScriptService 是惟一一个需要在 .NET Web 服务中定义才能被 ASP.NET AJAX 页面使用的ASP.NET AJAX 属性。但另一个名为 ScriptMethod 的属性也可以直接应用于服务中的Web Methods。ScriptMethod 定义了三个属性:UseHttpGet、ResponseFormat 和 XmlSerializeString。可在下列情况下更改这些属性:某个Web Method 接受的请求类型需要更改为GET;某个 Web Method 需要以 XmlDocument 或 XmlElement 的格式返回原始的 XML 数据;或从某个服务返回的数据应始终序列化为XML 而非 JSON。
UseHttpGet属性可在 Web Method 应接受 GET 请求而非 POST 请求时使用。请求被使用Web Method输入参数转换为QueryString 参数的URL 发送。UseHttpGet 属性的默认值为 false,且只有当操作确定为安全、没有敏感数据传递给Web 服务的情况下才能设为true。程序列表 6 的示例是使用带有 UseHttpGet 属性的 ScriptMethod 属性。
程序列表6.使用带有UseHttpGet属性的 ScriptMethod属性
[WebMethod] [ScriptMethod(UseHttpGet = true)] public string HttpGetEcho(string input) { return input; }当程序列表 6 中的 HttpGetEcho Web Method被调用时,被发送的标头示例如下: