使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常...
3.3 處理異步調(diào)用中的異常
在傳統(tǒng)的Web應(yīng)用程序中,處理異常相對來說比較簡單——即使開發(fā)者不作任何處理,瀏覽器也會默認(rèn)地將收到的異常信息顯示在瀏覽器中。而對于Ajax應(yīng)用程序來說,事情卻并不那么簡單。Ajax程序“異步”的天性加上其后臺運行的行為,讓用戶乃至開發(fā)者都很難判斷某次對服務(wù)器的調(diào)用是否順利完成,瀏覽器自然也對Ajax程序運行時發(fā)生的異常無能為力。
在本章前面兩節(jié)中,借助于ASP.NET AJAX異步通訊層的幫助,我們已經(jīng)能夠容易地從客戶端向服務(wù)器端發(fā)起異步HTTP請求——在理想情況下,這自然不會有什么問題,也足夠使用。然而,Web程序在運行中會有很多不確定性,從網(wǎng)絡(luò)狀況的不穩(wěn)定到開發(fā)者的粗心大意,任何一個難以預(yù)料的問題均會導(dǎo)致某次異步調(diào)用以失敗告終。
因此,在ASP.NET AJAX異步通訊層的實現(xiàn)中,自然也內(nèi)建了對異步調(diào)用時異常的處理方法。還記得前面曾經(jīng)介紹過的在客戶端調(diào)用Web Service代理的語法嗎?
[NameSpace].[ClassName].[MethodName](param1, param2 …, callbackFunction)在調(diào)用成功的回調(diào)函數(shù)callbackFunction的后面,我們還可以提供另一個調(diào)用失敗的回調(diào)函數(shù)。這樣,客戶端調(diào)用Web Service代理的語法就變?yōu)?#xff1a;
[NameSpace].[ClassName].[MethodName](param1, param2 …, onSucceeded, onFailed)注意其中粗體部分新添加的onFailed回調(diào)函數(shù),該函數(shù)將在本次異步通訊出現(xiàn)異常時由ASP.NET AJAX異步通訊層調(diào)用。而onSucceeded的行為則不會收到任何影響,仍將在成功調(diào)用后執(zhí)行。
onFailed回調(diào)函數(shù)將接受一個類型為Sys.Net.WebServiceError的參數(shù),表示異常對象。其函數(shù)簽名將類似如下所示:
function onFailed(error) { // 取得異常信息并處理 }ASP.NET AJAX的客戶端Sys.Net.WebServiceError類型封裝了異步請求服務(wù)器時可能發(fā)生異常,它提供了若干個只讀的屬性,提供了對異常信息的詳細(xì)描述。Sys.Net.WebServiceError類型的屬性如表3-1所示。
表3-1 Sys.Net.WebServiceError類型的屬性
注意:根據(jù)ASP.NET AJAX客戶端組件的命名規(guī)范,訪問屬性均需要在屬性名稱前加上“get_”或“set_”前綴。例如,若想得到某個Sys.Net.WebServiceError類型異常的message屬性值,則應(yīng)該按照如下方式書寫代碼:
var errorMessage = errorObj.get_message();下面讓我們用一個簡單的示例程序演示在客戶端調(diào)用Web Service代理時發(fā)生異常的處理辦法,以及Sys.Net.WebServiceError類型中各個屬性的使用方法。
該示例程序是一個除法的計算器,程序?qū)⒔柚鶤SP.NET AJAX異步通訊層將用戶輸入的除數(shù)和被除數(shù)發(fā)送至服務(wù)器,服務(wù)器完成具體的觸發(fā)計算過程后再將結(jié)果返回至客戶端顯示出來。程序運行的初始界面如圖3-4所示。
圖3-4 除法計算器的初始界面
輸入除數(shù)和被除數(shù),然后點擊問號(“?”)按鈕,程序?qū)⒄{(diào)用服務(wù)器端Web Service完成本次除法,并將商顯示在問號按鈕中,如圖3-5所示。
圖3-5 執(zhí)行一次普通的除法
若是用戶輸入的除數(shù)為0,那么顯然服務(wù)器端執(zhí)行時將拋出異常。我們不會在服務(wù)器端對該異常進(jìn)行處理,因此將導(dǎo)致本次異步調(diào)用失敗,客戶端也會顯示出異常的詳細(xì)信息。如圖3-6所示。
圖3-6除數(shù)為0導(dǎo)致本次除法失敗
讓我們先從服務(wù)器端的Web Service入手。我們將該Web Service命名為MathService,并在其中定義了一個名為Divide()的方法,用來執(zhí)行除法操作。Divide()方法所接受的兩個參數(shù)分別代表被除數(shù)和除數(shù),其邏輯非常簡單,代碼如下:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class MathService : System.Web.Services.WebService { [WebMethod] public int Divide(int a, int b) { return (int)(a / b); } }這里有必要再次提醒一下,Web Service類要添加[ScriptService]屬性,其中需要暴露給客戶端的方法也要添加[WebMethod]屬性——這些都是允許從客戶端調(diào)用該Web Service代理的必要條件。
在ASP.NET頁面中,添加ScriptManager控件以及上述Web Service的引用:
<asp:ScriptManager ID="sm" runat="server"> <Services> <asp:ServiceReference Path="Services/MathService.asmx" /> </Services> </asp:ScriptManager>然后在ASP.NET頁面中定義程序的界面:
<input id="tbA" type="text" style="width: 40px" /> / <input id="tbB" type="text" style="width: 40px" /> = <input id="btnInvoke" type="button" value="?" onclick="return btnInvoke_onclick()" /> <div id="result"></div>其中前兩個<input />(id分別為tbA和tbB)用來讓用戶輸入被除數(shù)和除數(shù);第三個<input />(id為btnInvoke)則作為按鈕(type="button")用來觸發(fā)對服務(wù)器端Web Service的調(diào)用,并顯示除法完成后的商;下面id為result的<div />用來顯示可能出現(xiàn)的異常信息。
function btnInvoke_onclick() { var a = $get("tbA").value; var b = $get("tbB").value; MathService.Divide(a, b, onSucceeded, onFailed); }注意其中粗體部分,即調(diào)用Web Service客戶端代理的一行。其中不但傳入了被除數(shù)和除數(shù)(a和b),還傳入了成功調(diào)用后的回調(diào)函數(shù)onSucceeded以及失敗時的回調(diào)函數(shù)onFailed。
成功調(diào)用時的回調(diào)函數(shù)onSucceeded()比較簡單,這里不贅:
function onSucceeded(result) { $get("btnInvoke").value = result; $get("result").innerHTML = ""; }失敗時的回調(diào)函數(shù)onFailed()才是本示例程序的重點:
function onFailed(error) { // 取得異常信息 var stackTrace = error.get_stackTrace(); var message = error.get_message(); var statusCode = error.get_statusCode(); var exceptionType = error.get_exceptionType(); var timeout = error.get_timedOut(); // 顯示異常信息 $get("result").innerHTML = "<strong>Stack Trace: </strong>" + stackTrace + "<br/>" + "<strong>Service Error: </strong>" + message + "<br/>" + "<strong>Status Code: </strong>" + statusCode + "<br/>" + "<strong>Exception Type: </strong>" + exceptionType + "<br/>" + "<strong>Is Timeout: </strong>" + timeout; $get("btnInvoke").value = "?"; }可以看到,onFailed()函數(shù)首先取得了傳遞進(jìn)來的Sys.Net.WebServiceError對象的各個屬性,然后再依次顯示到id為result的<div />中。
這樣就完成了本示例程序的編寫。運行該程序并嘗試做一些除法,若程序編寫正確的話,你將看到如圖3-4、圖3-5和圖3-6所示的界面。
當(dāng)然,本示例程序的目的是為了演示調(diào)用服務(wù)器端Web Service時發(fā)生異常的處理方法,所以自然事無巨悉地將所有異常信息均顯示了出來。而在實際開發(fā)中,我們則不應(yīng)該完整顯示出此類唐突的異常細(xì)節(jié)。通常的做法是根據(jù)不同的異常進(jìn)行相應(yīng)的處理,并在需要的情況下再為用戶顯示出相對友好的提示消息。
轉(zhuǎn)載于:https://www.cnblogs.com/dflying/archive/2007/06/06/772923.html
總結(jié)
以上是生活随笔為你收集整理的使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft.XMLHTTP 使用
- 下一篇: react 组件与组件之间通讯