一、 简介
    如今,微软最新推出的AJAX框架为ASP.NET AJAX 1.0(下载地址为[url]http://ajax.asp.net/downloads/default.aspx[/url],由ASP.NET 2.0 AJAX Extensions 1.0和ASP.NET AJAX Control Toolkit两部分组成)。这个框架具有如下优点:
 丰富的Web用户体验框架;
 与.NET编程模型无缝地集成到一起;
 开发者可以自由选择应用程序模型以服务器端为中心还是以客户端为中心;
 完全跨平台并基于标准实现;
 无需客户端安装。
   
    ASP.NET AJAX 1.0以面向对象技术对JavaScript进行了高级包装,便于开发人员以流行的面向对象方式进行客户端JavaScript编程,从而大大简化了JavaScript编码及调试。

在以前的ASP.NET 2.0 Web应用程序中,为了使客户端能够访问Web服务,开发者还需要创建一个运行于服务器端的应用程序(或由系统提供相应的代理),还需要创建一个Web应用程序,使用Visual Studio .NET或wsdl.exe生成Web服务的代理,并用该Web应用程序实现这个代理。现在,开发者终于可以完全在客户端实现对Web服务的调用了。在创建客户端页面时,只要在ScriptManager的<Services>标签中添加<asp:ServiceReference>元素,指向你的Web服务即可。

本文中,我将通过一个具体示例来实现直接通过以ASP.NET AJAX 1.0框架JavaScript访问Web服务。
   
    【作者注】在此,我们省略了有关ASP.NET AJAX 1.0的具体下载及配置介绍。如果你是ASP.NET AJAX 1.0新手,请细致查看其中附带的帮助说明及在线文档。
二、 案例分析
(一)创建Web页面
启动Visual Studio 2005,选择“文件→新建网站…”,然后选择“ASP.NET AJAX-Enabled Web Site”模板,命名工程为“WebServiceTest”,并选择C#作为编程语言(如图1所示),最后点击OK。
   
图1.使用“ASP.NET AJAX-Enabled Web Site”模板快速创建AJAX应用程序。
然后,把Default.aspx页面修改成如下图2所示形式: 
   
    图2.设计调用Web服务的客户端Web页面。

注意,在上面的向导操作完成后,系统自动为页面添加了一个ScriptManager服务器控件。这个控件是整个ASP.NET AJAX 1.0框架的核心,它管理着客户端运行时所需要的用于实现客户端功能的各种JavaScript脚本库的部署。而且,在新版本的框架中,这个控件的功能更为强大,使用更为简易,从下面的例子中我们即可看出这一点。此外,为了便于我们在本文中试验使用客户端JavaScript调用Web服务,上面表单中的按钮为HTML Input Button控件,而另外三个文本框都是HTML Input Text控件。

(二)创建Web服务
接下来,我们将编写一个web服务以便由浏览器端JavaScript访问之。在此,仅为说明问题,我们使用了一个最简单的二整数求和的例子。
1. 右击工程,并点击“添加新项…”。在“添加新项”对话框中,从已安装的模板列表中选择“Web服务”,并且命名为SumService.asmx(如图3所示)。

    图3.在工程中添加“Web服务”模板。
2. 通过第1步,有两个文件将被创建到你的应用程序中。一个是SumService.asmx,位于你的应用程序根目录下;另一个是SumService.cs,位于App_Code文件夹下,相应于该web服务的Code Behind文件。
3. 打开文件SumService.cs。我们要在这个文件中编写web方法以便实现前面的目标。
4. 在当前文件中添加下列必要的命名空间(加粗部分):

………… using System.Web.Services.Protocols; using System.Web.Script.Services;
5. 据框架提供的资料,在此必须使用ScriptService属性来修饰web服务,这样才使得JavaScript脚本能够访问这个服务。为此,在服务类定义的上面添加下列一行(加粗部分)。
[WebService(Namespace= "[url]http://tempuri.org/[/url]")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class SumService: System.Web.Services.WebService {
6. 在这个服务类中,我们将编写一个WebMethod—GetSum,它将返回两个整数的和。该方法的具体定义形式如下所示: 
 
[WebMethod] public int GetSum (int a,int b) { return(a+b); }

【注】有关Web方法的定义形式在框架资料中提供了多种形式的属性修饰符,主要是针对这些方法可能返回不同复杂程度的数据,在此略过。
(三)调用Web服务
    接下来,切换到上面Web表单的设计视图,点选ScriptManager1控件,在其“属性”窗口中点击“Services”属性右边的“…”进入到“ServiceReference集合编辑器”对话框并按下面图4所示进行操作。

图4.基于“属性”对话框配置方式编程ScriptManager控件。
最后源码视图中代码如下所示: 
<asp:ScriptManager ID="ScriptManager1" runat="server" > <Services> <asp:ServiceReference Path="SumService.asmx" /> </Services> </asp:ScriptManager>

通过此操作,我们在ScriptManager的<Services>标签中创建了一个ServiceReference实例,指向SumService.asmx。

【注】我们从图4中的序号①处还可以看出,完全可以为ScriptManager控件指定它所控制下的.js脚本文件;但由于本文示例没有在独立的.js文件中访问Web服务,所以也在此略过。

最后,我们来编写调用Web服务代理的代码,并将页面上的两个文本域的值传递给该Web服务。在设计视图中,双击“获取求和结果”按钮生成该按钮的事件处理函数。然后,将下列代码添加到其相应的事件处理器函数中:

function btnSum_ { SumServiceSpace.SumService.set_defaultSucceededCallback( OnSuccess);//这一句必须有 //SumServiceSpace.SumService.set_defaultFailedCallback(OnFailure); SumServiceSpace.SumService.GetSum( eval(form1.TextBoxA.value), eval(form1.TextBoxB.value), OnSuccess() ); } function OnSuccess(result){ $get("TextBoxSum").value=result; }
在JavaScript中,可以用HTML控件所在的表单名作为前缀,加上该HTML控件的名称来得到这个控件的引用。在本示例中,表单名称为form1,因此通过form1.TextBoxA.value即可得到TextBoxA文本域中的值。
另外,在本示例中,Web服务的类名为SumService,它定义于SumServiceSpace命名空间中。

特别需要注意的是,在此所使用的从JavaScript中调用Web服务的方法是使用了回调函数思想。其中,OnSuccess即对应这个回调函数,所有对于Web服务方法返回值(result)的操作都是在这里完成的。此外,你还可能已经注意到了Web服务中定义的GetSum方法仅仅接受2个参数,而在JavaScript的调用中却传入了3个参数(其实还有一个,在此省去了)。这个附加的参数正是代表了回调函数的名称,用于指向服务调用成功完成时执行的函数(另一个相应于服务调用超时或出错时执行的回调函数)。显然,这种调用方式将Ajax中异步特性的处理代码隐藏了起来(这不由得我们回想起Win32中大量回调函数的原理及使用方法)。
在本示例中,按照如下代码编写这个服务调用成功时的回调函数:
function OnSuccess(result){
$get("TextBoxSum").value=result;
}

注意,无论调用成功或超时,Web服务中定义的GetSum方法都将返回一个值,包含在回调函数的result参数中。在本示例中,对于一次成功的请求/响应,result参数将包含经过计算后的两个整数之和。此外,$get("TextBoxSum")相应于DOM编程中常用的document.getElementById("TextBoxSum"),ASP.NET Ajax框架对此作了简化。

(四)调试与运行结果
按F5运行此示例时,运行结果如图5所示:
   
    图5.通过客户端JavaScript调用Web服务示例运行时刻快照。

【疑问】读者在调试时会注意到,在点击图5中按钮出现结果的瞬间会在第三个文本框中先出现一个“Undefined”的字符串,然后才显示结果6912,但目前我也没有找到原因,欢迎朋友们帮助解决。

三、 小结
  本文通过一个简单实例介绍了如何使用ASP.NET AJAX 1.0框架对JavaScript以面向对象技术来访问Web服务。同时,我们也领略了该框架提供的脚本库使得JavaScript更易于编写、调试和维护。其实,ASP.NET AJAX 1.0框架还对服务端相关AJAX操作进行了大量高级包装并引入了强有力的服务器端扩展控件。总之,ASP.NET AJAX 1.0框架很有希望成为广大商家基于ASP.NET 2.0平台并利用AJAX技术进行Web开发的首选扩展框架。

在ASP.NET AJAX 1.0框架中访问Web服务相关推荐

  1. 使用ASP.NET AJAX 1.0框架PreviewGlitz进行网页动画编程

    一.引言 微软最新推出的AJAX框架为ASP.NET AJAX 1.0(下载地址为[url]http://ajax.asp.net/downloads/default.aspx[/url]),此框架由 ...

  2. ASP.NET AJAX 4.0 中的数据绑定

    代码下载: 围绕该 bush 击退停止:AJAX 是可能仅使用一个强的 JavaScript 引擎,可以在客户端浏览器中运行,并提供更高级和异步功能基础的. JavaScript 库当前包含在 ASP ...

  3. asp.net ajax 1.0中detailview与updatepanel混合使用的例子

    asp.net ajax 1.0中detailview与updatepanel混合使用的例子 在asp.net ajax 1.0中,如果有一个detailview控件,想做到每点detailview中 ...

  4. ASP.NET Ajax 1.0 RC 'Sys' 未被定義 問題

    ASP.NET Ajax 1.0 RC 'Sys' 未被定義 問題 您在依照筆者的影片安裝ASP.NET Ajax 1.0 RC 之後,可能會在測試時發現有底下的錯誤訊息: 請在 Web.Config ...

  5. AjaxControlToolkit requires ASP.NET Ajax 4.0 scripts错误 收藏

    AjaxControlToolkit requires ASP.NET Ajax 4.0 scripts错误 收藏 今天在用ajax做一个搜索自动补全的例子时,出现了一个问题 这是错误提示:AjaxC ...

  6. ASP.NET AJAX 1.0 发布

    ASP.NET AJAX在今天正式发布了,同时发布的还包括它的源码以及ASP.NET AJAX控件工具包. 值得一提的是ASP.NET AJAX控件工具包中包含有30多个免费的ASP.NET AJAX ...

  7. Asp.net MVC 1.0 RTM中实现文件上传

    Asp.net MVC 1.0 RTM中实现文件上传 在我们开始之前,你需要知道一个form以post方式上传文件的方式,你将要增加一个特别的enctype attribute到form标签上,为了这 ...

  8. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...

  9. ruby和python_Ruby,Python和Java中的Web服务

    ruby和python 今天,我不得不准备一些示例来说明Web服务是可互操作的. 因此,我已经使用Metro使用Java创建了一个简单的Web服务,并在Tomcat上启动了它. 然后尝试使用Pytho ...

最新文章

  1. 流水灯实例,点亮发光管LED并闪烁(查表操作)
  2. javascript基础07
  3. 湖北经济学院的计算机是否强,graphics-ch11-真实感图形绘制_湖北经济学院:计算机图形学_ppt_大学课件预览_高等教育资讯网...
  4. c++模板类静态成员变量_一文讲透父子类中静态变量,成员变量初始化顺序原理...
  5. 学java还是python还是php-大一的时候学习Python,大二学java好还是php?
  6. 用FRP,内网端口映射到外网,记录
  7. Opencv之使用pylibdmtx解析DataMatrix码
  8. bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(切比雪夫距离+multiset贪心+并查集)
  9. jetty的安装,优化
  10. python ocr 识别车牌_python 实现的车牌识别项目
  11. idea导入java文件_怎么在idea中导入Java文件并运行文件
  12. C语言,最新猴子摘桃(递归方法)
  13. ubuntu系统调节显卡GPU风扇转速
  14. 用FAI制作debian自动安装盘
  15. 华为鸿蒙新机是哪款,华为新机来了!预装鸿蒙 OS,搭载麒麟 9000!
  16. 打印机修复工具_打印机常见故障排除及修复方法
  17. 英语文章书写规则总结
  18. 物联网的通天塔困境:试图平息标准之争反而引发另一场大战
  19. 计算机辅助设计简称为才,高校视觉传达专业计算机辅助设计的学科建设论文
  20. 计算机与音乐结合论文,计算机毕业论文:浅谈计算机音乐技术在音乐教学中的应用...

热门文章

  1. CSS学习01之我的第一css程序
  2. java rest 序列化_http请求/restful/序列化反序列化/JSON
  3. 大数据审计的发展_从历史的角度看大数据审计发展
  4. 主机关机后第二天就无法开机_手机关机后“开机”,跟直接“重启”有区别吗?看完又涨知识了...
  5. 正则表达式发明者_正则表达式 – 简介
  6. faster rcnn源码解读(五)之layer(网络里的input-data)
  7. 基于Android的百度地图开发
  8. Python-OpenCV 处理视频(五): 运动方向判断
  9. Shiro安全框架【快速入门】就这一篇!
  10. Android官方培训课程中文版