在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的尴尬相关推荐

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

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

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

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

  3. Task1:爬虫基础知识

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

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

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

  5. Asp.net Ajax框架教程

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

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

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

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

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

  8. 驳“AJAX 的七宗罪”

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

  9. AJAX开发简略 (转)

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

最新文章

  1. 10-19政治单选-多选答案
  2. 入职谷歌、微软的大佬总结的刷题笔记.pdf
  3. pysvn安装及常用方法
  4. Hdu-6243 2017CCPC-Final A.Dogs and Cages 数学
  5. 动态加载子节点_简易数据分析 10 | Web Scraper 翻页—抓取「滚动加载」类型网页...
  6. Android 驱动(16)---AOSP如何单独build kernel
  7. 基于JAVA+Servlet+JSP+MYSQL的银行账户管理系统
  8. 启动级别:init 0,1,2,3,4,5,6
  9. [转载] 用python写的一个简单的记事本
  10. 剑指offer——面试题41-2:和为S的两个数字
  11. pytorch实现attention_Self-Attention手动推导及实现
  12. dmg镜像如何写入u盘_最全macOS官方全家桶原版系统镜像
  13. 用户活跃、留存、流失,终于讲清楚了!
  14. 使用Cython将python文件打包成.so文件
  15. 遇到问题---maven----Unable to process Jar entry
  16. Roson的Qt之旅#97 Qt编译报错-Could not determine which “make“ command to run
  17. uva 1647(规律)
  18. tcp 与udp 的区别
  19. c语言stdoux串口流,嵌入式C语言代码优化的一些经验
  20. 基于visual Studio2013解决面试题之1003字符串逆序

热门文章

  1. duilib入门简明教程 -- 部分bug (11) (转)
  2. .net:Code First 创建或更新数据库
  3. MySql命令行基本操作
  4. map 循环_被问到Spring循环依赖怎么解决?秀给面试官看!内附图解
  5. 表面配准论文1--基于高阶图匹配方法的稠密表面配准
  6. 《Hadoop实战》的笔记-2、Hadoop输入与输出
  7. aesmiyao php_PHP使用AES,ECB模式块和PKCS5Padding生成对称密钥
  8. js里面拼接代码和使用ModelAndView
  9. java xml dom getelementbyid,DOM中常见的元素获取方式
  10. 异想维度 java_Java实现多字段(维度)复杂排序