您的位置:首页 > 其它

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

2013-11-27 21:44 471 查看
一个好的Web应用程序,强大的异常处理是少不了的。最近在学习Ajax的过程中,我总结了几种不同情况下的处理异步调用中异常的不同办法;想分享给大家;
1,在客户端调用Web Service代理时发生异常的处理办法
2,使用Asp.NetAjax内建的异常处理方法
3,Web.Config中customError节中设置错误跳转页

此篇博客总结的是:在客户端调用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的参数,表示异常对象。如下:
Function onFailed(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类型的属性的使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐