Ajax程序:处理异步调用中的异常(在客户端调用Web Service代理时发生异常的处理办法)

一个好的Web应用程序,强大的异常处理是少不了的。最近在学习Ajax的过程中,我总结了几种不同情况下的处理异步调用中异常的不同办法;想分享给大家;

1,在客户端调用Web Service代理时发生异常的处理办法

2,使用Asp.NetAjax内建的异常处理方法

3,Web.ConfigcustomError节中设置错误跳转页

此篇博客总结的是:在客户端调用Web Service代理时发生异常的处理方法

由于Ajax的异步效果,加上后台的运行,让我们很难判断某次对服务器的请求是否顺利完成,浏览器对Ajax程序运行时发生的异常无能为力;

Ajax的使用,使Web应用程序从客户端想服务器端发起异步Http协议请求,在理想情况下是没有问题的,但是Web程序的运行并不是一直顺利的,它有着很多不确定性——网络故障、。。。开发者的粗心大意,一旦出现问题就会导致异步请求失败

在开发中提高性能,尽量避免这些异常,但是有些异常是避免不了的,这样的话,我们就该处理这些异常。

当然,Asp.Net Ajax也考虑到了这些,并提供了一整套针对异步回调过程中发生的异常处理机制;

进入主题:在客户端调用Web Service代理时发生异常的处理办法;

客户端调用Web Service代理的语法:

[NameSpace].[ClassName].[MethodName](param1,param2,...,onSuceeded,onFailed)

——其中:onSuceeded:成功时调用函数;

onFailed:失败时调用函数;(博客介绍的重点之处)

onFailed回调函数会接收一个类型为Sys.Net.WebServiceError的参数,表示异常对象。如下:

FunctiononFailed(error){

//显示异常信息

//处理异常信息

}

注:

ASP.NET AJAX的客户端Sys.Net.WebServiceError类型封装了异步请求服务器时可能发生的异常,它提供了若干个只读的属性,提供了对异常信息的详细描述。Sys.Net.WebServiceError类型的属性如下(在接下来的例子将会用到这些属性):

属  性

描  述

exceptionType

获取服务器端异常的具体类型

message

获取详细的异常描述信息

statusCode

获取造成异常的HTTP响应的状态码

stackTrace

获取服务器端异常的栈跟踪信息

timedOut

获取一个布尔值,表示异常是否是由于网络连接超时造成的

例子:

服务器端:ErroHandling.asmx

定义了两个方法GetDivision(int a,int b):实现两个整数相除,并返回相除结果; int Timeout():

<%@ WebService Language="C#" Class="ErrorHandling" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
using System.Threading;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ErrorHandling  : System.Web.Services.WebService
{
	[WebMethod]
	public int GetDivision(int a,int b)
	{           
       
       return a / b;
           
	}

	[WebMethod]
	public int Timeout()
	{
		Thread.Sleep(5000);
		return 0;
	}
}


(注意:Web Service类要添加[ScriptService]标记;方法标记[WebMethod]表示:服务器端释放该方法,客户端可访问服务器端的该方法)

客户端调用服务器端的GetDivision(int a,int b)函数,并传入两个参数:2,0;程序借助Asp.Net Ajax异步通信层将参数发送至服务器,服务器完成计算后将结果返回至客户端;

显然,因为输入的被除数为0,服务器端执行时必定要抛出异常;但是

并没有在服务器端做异常处理,此时客户端也许会显示异常错误,但是如果客户端并没有显示异常错误,那么客户端的用户就要无限期的等下去,可见是多么的不合理;那么如何在客户端处理此类异常?

新建Asp.Net页面5_ClientProxy.aspx;前台添加ScriptManager控件(

和UpdatePanel控件联合使用可以实现页面异步局部更新的效果),ErrorHandling.asmx的引用:

<asp:ScriptManager ID="ScriptManager1" runat="server">
		<Services>
			<asp:ServiceReference Path="ErrorHandling.asmx" />
		</Services>
</asp:ScriptManager>

添加两个按钮,并且分别在单击事件中调用getDivision(int a,int b)timeout()方法(注:getDivision()函数传入的参数为5,0:即被除数为0)

<input type="button" value="getDivision" onclick="getDivision(5,0)" />
<input type="button" value="timeout" onclick="timeout()" />



<script language="javascript" type="text/javascript">
  ErrorHandling.set_timeout(2000);
//getDivision(int a,int b)方法:
function getDivision(a,b)
{
	function getDivision(a,b)
	 {
	    ErrorHandling.GetDivision(a,b,succeededCallback,FailedCallback);
		//调用服务器端GetDivision(int a,int b)函数,成功时的回调函数为succeededCallback(),失败时的回调函数FailedCallback()
         }
}
function timeout()
 {
    ErrorHandling.Timeout(succeededCallback,FailedCallback);
 }

 function succeededCallback(result)
 {
    alert(result)
 }

 function FailedCallback(error,userContext,methodName) 
{
      // ASP.NET AJAX的客户端Sys.Net.WebServiceError类型封装了异步请求服务器时可能发生的异常,它提供了若干个只读的属性,提供了对异常信息的详细描述。Sys.Net.WebServ- iceError类型的属性,如下:
		        //属  性	              描  述
		        //exceptionType	 获取服务器端异常的具体类型
		        //message	            获取详细的异常描述信息
		        //statusCode	             取造成异常的HTTP响应的状态码
		        //stackTrace	            获取服务器端异常的栈跟踪信息
		        //timedOut	             获取一个布尔值,表示异常是否是由于网络连接超时造成的

    var message = String.format(
	"Timeout: {0}\nMessage: {1}\nExceptionType: {2}\nStackTrace: {3}",error.get_timedOut(),error.get_message(),error.get_exceptionType(),error.get_stackTrace());

     alert("Error at " + methodName + "\n\n" + message);
 }

</script>

点击"getDivision"按钮:因为被除数为0,有异常,所以调用回调函数FailedCallback(),运行结果如下图;假如传入的参数为5,1,则调用succeededCallback()函数



点击"timeout"按钮:因为睡眠时间为5秒,超过设定的2秒,所以所以调用回调函数FailedCallback(),运行结果如下图;假如设定6秒,则调用succeededCallback()函数



总结:

本篇博客主要讲:在客户端调用Web Service代理时发生异常的处理办法,以及Sys.Net.WebServiceError类型的属性的使用

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...