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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ajax与CustomErrors的尴尬

發布時間:2023/12/1 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ajax与CustomErrors的尴尬 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在ASP.NET程序中,為了給用戶顯示友好的錯誤信息,通常在web.config中進行如下的設置:

<customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm"> </customErrors>

但如果是一個ajax請求在服務端發生了錯誤,將遭遇一個尷尬。我們就遭遇過這樣的尷尬,見下圖:

上圖中顯示“抱歉!系統發生了錯誤!”的地方是ajax加載的內容,ajax部分的js代碼如下:

$.ajax({ success: function (data) {if (data) {resultElement.html(data);}} });

從上面的代碼可以知道,雖然ajax請求出錯,但依然在success回調函數中處理了,導致將定制錯誤信息作為正常返回內容顯示出來,從而造成前圖中的尷尬。

剛面對這個問題時,我們想到的解決方法是根據statusCode進行判斷,如果是500,就知道是發生了錯誤,然后進行特定的錯誤處理。我們寫了這樣的測試代碼:

$.ajax({statusCode: {500: function () {console.log('error!');}},success: function (data) {if (data) {resultElement.html(' ' + data);}} });

結果發現,并沒有執行對應于500 statusCode的回調函數。

在瀏覽器中查看了一下,原來服務器端返回的是302狀態碼。也就是說,在默認情況下,ASP.NET用重定向的方式向瀏覽器返回定制錯誤信息。在web.config>CustomErrors中,有個專門的屬性redirectMode,其默認值就是ResponseRedirect。redirectMode還有個值是ResponseRewrite,能不能解決我們的問題呢?我們改一下web.config試一試,修改如下:

<customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm" redirectMode="ResponseRewrite"> </customErrors>

結果發現,的確是返回500狀態碼了,但定制錯誤錯誤沒了,返回的是Runtime Error。

當設置redirectMode="ResponseRewrite",發生錯誤時,ASP.NET實際會執行Server.Transfer()返回定制錯誤信息頁面,而Server.Transfer()與ASP.NET MVC路由存在兼容問題,詳見CustomErrors does not work when setting redirectMode=“ResponseRewrite”。

服務端暫時找不到解決方法,從瀏覽器端下手試試。

我們想到一個解決思路,就是根據302 statusCode進行處理,根據我們的實際場景(redirectMode是默認值ResponseRedirect),如果服務端返回的是302,肯定是發生了錯誤。于是,我們改為如下的ajax代碼:

$.ajax({statusCode: {302: function () {console.log('error!');}},success: function (data) {if (data) {resultElement.html(' ' + data);}} });

結果發現,并沒有執行302的回調函數,也就是說ajax請求根本拿不到302狀態碼(http status code),實際得到的還是200狀態碼。

既然瀏覽器端也找不到解決方法,只有“回頭是岸”,回到服務器端。

既然CustomErrors解決不了問題,那我們就把它給廢了:

<customErrors mode="Off"> </customErrors>

然后自己處理定制錯誤信息,在Global.asax.cs中添加如下的代碼:

protected void Application_Error(Object sender, EventArgs e) {Exception lastError = Server.GetLastError();if (lastError != null){Response.StatusCode = 500;Response.WriteFile("~/error/error.htm");Server.ClearError();} }

問題就這樣解決了!

另外,不用默認的“重定向顯示定制錯誤信息”方式還有一個很大的好處,在發生錯誤時,瀏覽器地址欄不會跳轉,這樣用戶反饋錯誤時,可以直接反饋發生問題時實際訪問的完整網址。截個圖紀念一下CustomErrors曾經帶來的煩惱。

轉載自:http://www.cnblogs.com/dudu/archive/2012/11/20/ajax_custom_error.html

轉載于:https://www.cnblogs.com/ideacore/p/6289534.html

總結

以上是生活随笔為你收集整理的Ajax与CustomErrors的尴尬的全部內容,希望文章能夠幫你解決所遇到的問題。

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