日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常...

發布時間:2024/4/17 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文來自《ASP.NET AJAX程序設計 第II卷:客戶端Microsoft AJAX Library相關》的第三章《異步調用Web Service和頁面中的類方法》,請同時參考本章的其他文章。

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類型的屬性

  • 屬性名:描述
  • exceptionType:獲取服務器端異常的具體類型
  • message:獲取詳細的異常描述信息
  • statusCode:獲取造成異常的HTTP響應的狀態碼
  • stackTrace:獲取服務器端異常的堆棧跟蹤信息
  • timedOut:獲取一個布爾值,表示異常是否是由于網絡連接超時造成的
  • 注意:根據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):处理异步调用中的异常...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。