原文地址:http://www.cnblogs.com/dudu/archive/2012/11/20/ajax_custom_error.html

在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曾经带来的烦恼。

转载于:https://www.cnblogs.com/samsonhuang/articles/2778858.html

转:Ajax与CustomErrors的尴尬相关推荐

  1. Ajax与CustomErrors的尴尬

    在ASP.NET程序中,为了给用户显示友好的错误信息,通常在web.config中进行如下的设置: <customErrors mode="RemoteOnly" defau ...

  2. 爬虫学习一:HTTP、网页基础、requests、API、JS

    欢迎关注datawhale:http://www.datawhale.club/ 1. 学习内容 互联网.HTTP 网页基础 requests 使用API JS入门 2. 互联网.HTTP 2.1 互 ...

  3. Datawhale--组队学习第12期--python爬虫基础学习---task0/task1环境配置和网页请求基础

    先修知识:task0(基本类库安装,git,anaconda,文本处理) Task0(前置):需要自己安装有关环境,学习git(b站),下载有关driver Chromedriver 作用 驱动浏览器 ...

  4. Task1:爬虫基础知识

    基础知识了解: 1.互联网.HTTP 互联网 互联网也叫因特网(Internet),是指网络与网络所串联成的庞大网络,这些网络以一组标准的网络协议族相连,连接全世界几十亿个设备,形成逻辑上的单一巨大国 ...

  5. 前端通信:ajax设计方案(十)--- 完善Promise A+规范,增加mock数据功能

    同步更新博客: www.cnblogs.com/GerryOfZhon- 同步更新专栏: zhuanlan.zhihu.com/zhongqiang 同步更新github: github.com/Ge ...

  6. Asp.net Ajax框架教程

    目录 (一).概述... (二).应用场景代码示例... 1).ScriptManager控件示例...     1. 在异步调用服务端注册客户端脚本新方法...     2. 捕获Ajax异步调用中 ...

  7. 错误:'sys'未定义解决方法.(asp.net Ajax v1.0.61025版)

    重装系统后又装了ajax 可是用的时候老是提示"错误:'sys'未定义",看了看以前做的项目,发现Web.Config里面少了<httpHandlers>和<ht ...

  8. 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9

    这特么就尴尬了,说好的Vue支持IE8及以下的呢,引入jquery,测试IE个浏览器,IE9仍然显示不正常, 然而命令行测试Vue仍然存在, 数据回不来!数据回不来!数据回不来! 好吧  肉包子打狗$ ...

  9. 驳“AJAX 的七宗罪”

    (本文转载自"Java视线",原文地址:http://forum.javaeye.com/viewtopic.php?t=13844,作者dlee) (AJA X的七宗罪:http ...

  10. AJAX开发简略 (转)

    AJAX开发简略... 1 一.AJAX定义... 3 二.现状与需要解决的问题... 3 三.为什么使用AJAX. 4 四.谁在使用AJAX. 6 五.用AJAX改进你的设计... 6 例子1:数据 ...

最新文章

  1. Ubuntu下修改DNS重启也能用的方法
  2. Nhibernate 3.0 cookbook学习笔记 一对多与多对多映射
  3. android 请求参数打印,Android开发-----关于解决Retrofit打印HttpLog和设置连接超时的问题...
  4. 从0到1写RT-Thread内核——空闲线程与阻塞延时的实现
  5. 西门子rwd68温控器说明书_西门子RWD68说明书
  6. 为什么引入Memcached?
  7. 前端开发必备:js中的sort()排序函数
  8. multipart/form-data
  9. DB-Engines:Snowflake荣获2021年的年度DBMS
  10. 带你了解几种二进制代码相似度比较技术
  11. python tree 库_Python——tree
  12. c语言程序改错:求两个整数的最小公倍数,【C语言】求两个整数的最大公约数、最小公倍数...
  13. 洛谷1031 均分纸牌 解题报告
  14. cad lisp程序大集_AUTO CAD 命令大集
  15. linux 中文排版,Latex中文排版——XeLatex的用法
  16. Linux中常用的scree的安装和常用的screen命令
  17. c/c++ 实现三角函数(不使用库函数) sin/cos/tan/cot
  18. C语言超级搞笑的代码,冷笑话我们程序员也会讲的啊!
  19. Kaggle案例泰坦尼克号问题
  20. 携程Java后台开发三面面经

热门文章

  1. 多目标数据关联基本方法
  2. Ample Sound Ample Guitar Metal Hellrazer Mac - 虚拟九弦金属吉他
  3. Kontakt 6 for Mac(强大的音频采样器软件)
  4. Mac openssl 开发环境测试
  5. Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
  6. Kubernetes - - k8s - v1.12.3 一键部署高可用 Prometheus 并实现邮件告警
  7. mongodb常用命令脚本化-自动化运维
  8. 水题 Codeforces Beta Round #70 (Div. 2) A. Haiku
  9. 【Daily Scrum】12-25
  10. 基于 pureXML 技术的数据库表结构扩展