Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69039
  • 博文数量: 65
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 658
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-10 13:01
文章分类
文章存档

2011年(1)

2009年(64)

我的朋友

分类:

2009-06-17 14:47:03

Asp.net AJAX之所以将webService提高到如此重要的位置上,让它几乎成为了ASP.NET AJAX服务器端 逻辑最受推荐的实现方式,是因为Web Service天生就是纯粹为了业务逻辑而设计的。我们都知道,Web Service没有提供什么“花哨”的用户界面,而是心无旁骛地专注于程序逻辑上的实现,这恰好和ASP.NET AJAX客户端编程模型所倡导的“将表示层和业务层彻底分开”的理念不谋而合——客户端的ASP.NET AJAX框架用来处理程序所有的界面、用户交互功能,服务器端则仅仅提供纯粹的数据,不涉及任何表现样式。

  借助于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;
  }

阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~