使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常...
3.3 處理異步調用中的異常
在傳統的Web應用程序中,處理異常相對來說比較簡單——即使開發者不作任何處理,瀏覽器也會默認地將收到的異常信息顯示在瀏覽器中。而對于Ajax應用程序來說,事情卻并不那么簡單。Ajax程序“異步”的天性加上其后臺運行的行為,讓用戶乃至開發者都很難判斷某次對服務器的調用是否順利完成,瀏覽器自然也對Ajax程序運行時發生的異常無能為力。
在本章前面兩節中,借助于ASP.NET AJAX異步通訊層的幫助,我們已經能夠容易地從客戶端向服務器端發起異步HTTP請求——在理想情況下,這自然不會有什么問題,也足夠使用。然而,Web程序在運行中會有很多不確定性,從網絡狀況的不穩定到開發者的粗心大意,任何一個難以預料的問題均會導致某次異步調用以失敗告終。
因此,在ASP.NET AJAX異步通訊層的實現中,自然也內建了對異步調用時異常的處理方法。還記得前面曾經介紹過的在客戶端調用Web Service代理的語法嗎?
[NameSpace].[ClassName].[MethodName](param1, param2 …, callbackFunction)在調用成功的回調函數callbackFunction的后面,我們還可以提供另一個調用失敗的回調函數。這樣,客戶端調用Web Service代理的語法就變為:
[NameSpace].[ClassName].[MethodName](param1, param2 …, onSucceeded, onFailed)注意其中粗體部分新添加的onFailed回調函數,該函數將在本次異步通訊出現異常時由ASP.NET AJAX異步通訊層調用。而onSucceeded的行為則不會收到任何影響,仍將在成功調用后執行。
onFailed回調函數將接受一個類型為Sys.Net.WebServiceError的參數,表示異常對象。其函數簽名將類似如下所示:
function onFailed(error) { // 取得異常信息并處理 }ASP.NET AJAX的客戶端Sys.Net.WebServiceError類型封裝了異步請求服務器時可能發生異常,它提供了若干個只讀的屬性,提供了對異常信息的詳細描述。Sys.Net.WebServiceError類型的屬性如表3-1所示。
表3-1 Sys.Net.WebServiceError類型的屬性
注意:根據ASP.NET AJAX客戶端組件的命名規范,訪問屬性均需要在屬性名稱前加上“get_”或“set_”前綴。例如,若想得到某個Sys.Net.WebServiceError類型異常的message屬性值,則應該按照如下方式書寫代碼:
var errorMessage = errorObj.get_message();下面讓我們用一個簡單的示例程序演示在客戶端調用Web Service代理時發生異常的處理辦法,以及Sys.Net.WebServiceError類型中各個屬性的使用方法。
該示例程序是一個除法的計算器,程序將借助ASP.NET AJAX異步通訊層將用戶輸入的除數和被除數發送至服務器,服務器完成具體的觸發計算過程后再將結果返回至客戶端顯示出來。程序運行的初始界面如圖3-4所示。
圖3-4 除法計算器的初始界面
輸入除數和被除數,然后點擊問號(“?”)按鈕,程序將調用服務器端Web Service完成本次除法,并將商顯示在問號按鈕中,如圖3-5所示。
圖3-5 執行一次普通的除法
若是用戶輸入的除數為0,那么顯然服務器端執行時將拋出異常。我們不會在服務器端對該異常進行處理,因此將導致本次異步調用失敗,客戶端也會顯示出異常的詳細信息。如圖3-6所示。
圖3-6除數為0導致本次除法失敗
讓我們先從服務器端的Web Service入手。我們將該Web Service命名為MathService,并在其中定義了一個名為Divide()的方法,用來執行除法操作。Divide()方法所接受的兩個參數分別代表被除數和除數,其邏輯非常簡單,代碼如下:
[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]屬性——這些都是允許從客戶端調用該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)用來讓用戶輸入被除數和除數;第三個<input />(id為btnInvoke)則作為按鈕(type="button")用來觸發對服務器端Web Service的調用,并顯示除法完成后的商;下面id為result的<div />用來顯示可能出現的異常信息。
function btnInvoke_onclick() { var a = $get("tbA").value; var b = $get("tbB").value; MathService.Divide(a, b, onSucceeded, onFailed); }注意其中粗體部分,即調用Web Service客戶端代理的一行。其中不但傳入了被除數和除數(a和b),還傳入了成功調用后的回調函數onSucceeded以及失敗時的回調函數onFailed。
成功調用時的回調函數onSucceeded()比較簡單,這里不贅:
function onSucceeded(result) { $get("btnInvoke").value = result; $get("result").innerHTML = ""; }失敗時的回調函數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()函數首先取得了傳遞進來的Sys.Net.WebServiceError對象的各個屬性,然后再依次顯示到id為result的<div />中。
這樣就完成了本示例程序的編寫。運行該程序并嘗試做一些除法,若程序編寫正確的話,你將看到如圖3-4、圖3-5和圖3-6所示的界面。
當然,本示例程序的目的是為了演示調用服務器端Web Service時發生異常的處理方法,所以自然事無巨悉地將所有異常信息均顯示了出來。而在實際開發中,我們則不應該完整顯示出此類唐突的異常細節。通常的做法是根據不同的異常進行相應的處理,并在需要的情況下再為用戶顯示出相對友好的提示消息。
轉載于:https://www.cnblogs.com/dflying/archive/2007/06/06/772923.html
總結
以上是生活随笔為你收集整理的使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft.XMLHTTP 使用
- 下一篇: asp.net ajax控件工具集 Au