分类:
2009-06-17 14:47:03
借助于ASP.NET AJAX异步通信层所自动生成的Web Service客户端访问代理,在表示层代码(也就是javaScript)中调用Web Service获取数据变成了一件异常简单的事情——其表现出的优雅甚至让我们不敢相信:难道ajax程序也能写得这么简单?
接下来,我们通过一个简单的示例程序来了解在ASP.NET AJAX应用程序中使用JavaScript异步调用Web Service的方法。出于演示的目的,程序的功能非常简单:用户在页面的文本框中输入名字,然后点击旁边的按钮,如图3-1所示。
图3-1 用户在界面中输入自己的名字
程序将借助ASP.NET AJAX异步通信层以Ajax方式把用户的名字发送至服务器端的Web Service。随后该Web Service在服务器端根据用户的名字生成一段问候信息并发送回客户端,客户端收到服务器响应之后,将这段问候信息显示出来,如图3-2所示。
图3-2 程序显示来自服务器的问候信息
让我们先从服务器端的Web Service入手。新建一个名为SimpleWebService的Web
Service类,并在其中声明一个普通的Web
Service方法——SayHello()。该方法将接受一个名为name的参数,并生成一条问候信息返回:
[WebService(Namespace = "")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SimpleWebService : System.Web.Services.WebService
{
[WebMethod]
public string SayHello(string name)
{
return string.Format("Hello {0}!", name);
}
} 这就是一个普通的web Service,没有任何不一样之处。注意,不要忘记为SayHello()方法添加[WebMethod]属性,这是每个Web方法都必需的。
为了让asp.net AJAX生成该Web Service的客户端异步调用代理,进而允许我们在javaScript代码中直接调用该方法,我们还要再为SimpleWebService类添加 [ScriptService]属性,这一部分才是ASP.NET AJAX为Web Service提供的附加功能(注意代码中粗体部分):
//…………
[ScriptService]
//…………
public class SimpleWebService : System.Web.Services.WebService
{
//…………
}
我们也可以直接为需要暴露给客户端的Web Service方法添加[ScriptService]属性,而不必将其添加到Web Service类上。
[ScriptService]属性位于System.Web.Script.Services命名空间中,如果需要的话,还要添加如下的using语句:
using System.Web.Script.Services;
下面列出完整的SimpleWebService Web Service代码,注意其中粗体部分:
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
[WebService(Namespace = "")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class SimpleWebService : System.Web.Services.WebService
{
[WebMethod]
public string SayHello(string name)
{
return string.Format("Hello {0}!", name);
}
}
完成了Web Service编写之后,我们来先行测试一下——开发过程中不断地进行阶段性测试有助于尽快发现潜在的问题,并将其扼杀在萌芽中。如果一切顺利的话,那么测试该Web Service时可以看到如图3-3所示的结果。
图3-3 测试Web Service时的界面
接下来即可用asp.netAJAX异步调用这个web Service了。首先新建一个ASP.NET页面。当然,该页面所在的Web站点必须已经配置好了ASP.NET AJAX的支持,详细配置方法请参考本书第Ⅰ卷。在该页面上添加一个ScriptManager服务器端控件,这是每一个ASP.NET AJAX应用程序都必不可少的:
为了让ASP.NET AJAX为前面的Web Service生成客户端异步调用代理,我们需要在Script- Manager控件中添加该Web Service的引用:
这种声明语法隐约中传递了这样的含义:Web Service的客户端异步调用代理脚本将由ScriptManager控件管理——这非常自然,不是吗?ScriptManager就是用来管理 (manage)脚本(script)的呀!关于标签以及标签的详细使用方法,在本书第Ⅰ卷中已经有详细讨论,这里不赘。
随后声明程序界面中必不可少的UI元素:
onclick="return btnInvoke_onclick()" />
其中id为tbName的 作为文本框,用来让用户输入名字;id为btnInvoke的作为按钮,点击将触发异步调用Web Service;id为result的
则用来将Web Service返回的问候内容显示出来。这些id均将在稍后用到。
上面代码中btnInvoke按钮定义了click事件的事件处理函数,该函数的实现如下。注意这是客户端javaScript代码:
function btnInvoke_onclick() {
var theName = $get("tbName").value;
SimpleWebService.SayHello(theName, onSayHelloSucceeded);
}
首先用$get ("tbName").value取得了用户在文本框中输入的文字。然后第二句Simple- WebService.SayHello()即调用了ASP.NET AJAX异步通信层自动为SimpleWebService生成的客户端代理。这是本示例程序中最为重要的一句——与用C#在Web Service中声明的SayHello()方法签名相比,其参数个数以及顺序均完全一样,甚至调用语法也没什么特别之处,都是[NameSpace]. [ClassName].[MethodName](param1,param2,...,callbackFunction)。由此我们能够看出 ASP.NET AJAX异步通信层为降低开发者学习曲线、提高开发者生产效率所做出的努力及良苦用心。
关于用来取得DOM元素引用的$get()方法,请参考本卷第1章中的介绍。
客户端代理还提供了额外的一个参数——异步调用的回调函数名称,这里为onSayHelloSu-
cceeded。该回调函数将在服务器端异步调用成功返回后由ASP.NET
AJAX异步通信层自动调用。onSayHelloSucceeded()回调函数的代码如下:
function onSayHelloSucceeded(result) {
$get("result").innerhtml= result;
}