技术开发 频道

在ASP.NET AJAX 1.0框架中访问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_onclick() { 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框架对此作了简化。

0
相关文章