Ajax与CustomErrors的尴尬
在ASP.NET程序中,為了給用戶顯示友好的錯(cuò)誤信息,通常在web.config中進(jìn)行如下的設(shè)置:
<customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm"> </customErrors>但如果是一個(gè)ajax請求在服務(wù)端發(fā)生了錯(cuò)誤,將遭遇一個(gè)尷尬。我們就遭遇過這樣的尷尬,見下圖:
上圖中顯示“抱歉!系統(tǒng)發(fā)生了錯(cuò)誤!”的地方是ajax加載的內(nèi)容,ajax部分的js代碼如下:
$.ajax({ success: function (data) {if (data) {resultElement.html(data);}} });從上面的代碼可以知道,雖然ajax請求出錯(cuò),但依然在success回調(diào)函數(shù)中處理了,導(dǎo)致將定制錯(cuò)誤信息作為正常返回內(nèi)容顯示出來,從而造成前圖中的尷尬。
剛面對這個(gè)問題時(shí),我們想到的解決方法是根據(jù)statusCode進(jìn)行判斷,如果是500,就知道是發(fā)生了錯(cuò)誤,然后進(jìn)行特定的錯(cuò)誤處理。我們寫了這樣的測試代碼:
$.ajax({statusCode: {500: function () {console.log('error!');}},success: function (data) {if (data) {resultElement.html(' ' + data);}} });結(jié)果發(fā)現(xiàn),并沒有執(zhí)行對應(yīng)于500 statusCode的回調(diào)函數(shù)。
在瀏覽器中查看了一下,原來服務(wù)器端返回的是302狀態(tài)碼。也就是說,在默認(rèn)情況下,ASP.NET用重定向的方式向?yàn)g覽器返回定制錯(cuò)誤信息。在web.config>CustomErrors中,有個(gè)專門的屬性redirectMode,其默認(rèn)值就是ResponseRedirect。redirectMode還有個(gè)值是ResponseRewrite,能不能解決我們的問題呢?我們改一下web.config試一試,修改如下:
<customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm" redirectMode="ResponseRewrite"> </customErrors>結(jié)果發(fā)現(xiàn),的確是返回500狀態(tài)碼了,但定制錯(cuò)誤錯(cuò)誤沒了,返回的是Runtime Error。
當(dāng)設(shè)置redirectMode="ResponseRewrite",發(fā)生錯(cuò)誤時(shí),ASP.NET實(shí)際會執(zhí)行Server.Transfer()返回定制錯(cuò)誤信息頁面,而Server.Transfer()與ASP.NET MVC路由存在兼容問題,詳見CustomErrors does not work when setting redirectMode=“ResponseRewrite”。
服務(wù)端暫時(shí)找不到解決方法,從瀏覽器端下手試試。
我們想到一個(gè)解決思路,就是根據(jù)302 statusCode進(jìn)行處理,根據(jù)我們的實(shí)際場景(redirectMode是默認(rèn)值ResponseRedirect),如果服務(wù)端返回的是302,肯定是發(fā)生了錯(cuò)誤。于是,我們改為如下的ajax代碼:
$.ajax({statusCode: {302: function () {console.log('error!');}},success: function (data) {if (data) {resultElement.html(' ' + data);}} });結(jié)果發(fā)現(xiàn),并沒有執(zhí)行302的回調(diào)函數(shù),也就是說ajax請求根本拿不到302狀態(tài)碼(http status code),實(shí)際得到的還是200狀態(tài)碼。
既然瀏覽器端也找不到解決方法,只有“回頭是岸”,回到服務(wù)器端。
既然CustomErrors解決不了問題,那我們就把它給廢了:
<customErrors mode="Off"> </customErrors>然后自己處理定制錯(cuò)誤信息,在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();} }問題就這樣解決了!
另外,不用默認(rèn)的“重定向顯示定制錯(cuò)誤信息”方式還有一個(gè)很大的好處,在發(fā)生錯(cuò)誤時(shí),瀏覽器地址欄不會跳轉(zhuǎn),這樣用戶反饋錯(cuò)誤時(shí),可以直接反饋發(fā)生問題時(shí)實(shí)際訪問的完整網(wǎng)址。截個(gè)圖紀(jì)念一下CustomErrors曾經(jīng)帶來的煩惱。
轉(zhuǎn)載自:http://www.cnblogs.com/dudu/archive/2012/11/20/ajax_custom_error.html
轉(zhuǎn)載于:https://www.cnblogs.com/ideacore/p/6289534.html
總結(jié)
以上是生活随笔為你收集整理的Ajax与CustomErrors的尴尬的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS 7安装redis及php扩
- 下一篇: 01-17权限管理