转:Ajax与CustomErrors的尴尬
原文地址: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的尴尬相关推荐
- Ajax与CustomErrors的尴尬
在ASP.NET程序中,为了给用户显示友好的错误信息,通常在web.config中进行如下的设置: <customErrors mode="RemoteOnly" defau ...
- 爬虫学习一:HTTP、网页基础、requests、API、JS
欢迎关注datawhale:http://www.datawhale.club/ 1. 学习内容 互联网.HTTP 网页基础 requests 使用API JS入门 2. 互联网.HTTP 2.1 互 ...
- Datawhale--组队学习第12期--python爬虫基础学习---task0/task1环境配置和网页请求基础
先修知识:task0(基本类库安装,git,anaconda,文本处理) Task0(前置):需要自己安装有关环境,学习git(b站),下载有关driver Chromedriver 作用 驱动浏览器 ...
- Task1:爬虫基础知识
基础知识了解: 1.互联网.HTTP 互联网 互联网也叫因特网(Internet),是指网络与网络所串联成的庞大网络,这些网络以一组标准的网络协议族相连,连接全世界几十亿个设备,形成逻辑上的单一巨大国 ...
- 前端通信:ajax设计方案(十)--- 完善Promise A+规范,增加mock数据功能
同步更新博客: www.cnblogs.com/GerryOfZhon- 同步更新专栏: zhuanlan.zhihu.com/zhongqiang 同步更新github: github.com/Ge ...
- Asp.net Ajax框架教程
目录 (一).概述... (二).应用场景代码示例... 1).ScriptManager控件示例... 1. 在异步调用服务端注册客户端脚本新方法... 2. 捕获Ajax异步调用中 ...
- 错误:'sys'未定义解决方法.(asp.net Ajax v1.0.61025版)
重装系统后又装了ajax 可是用的时候老是提示"错误:'sys'未定义",看了看以前做的项目,发现Web.Config里面少了<httpHandlers>和<ht ...
- 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9
这特么就尴尬了,说好的Vue支持IE8及以下的呢,引入jquery,测试IE个浏览器,IE9仍然显示不正常, 然而命令行测试Vue仍然存在, 数据回不来!数据回不来!数据回不来! 好吧 肉包子打狗$ ...
- 驳“AJAX 的七宗罪”
(本文转载自"Java视线",原文地址:http://forum.javaeye.com/viewtopic.php?t=13844,作者dlee) (AJA X的七宗罪:http ...
- AJAX开发简略 (转)
AJAX开发简略... 1 一.AJAX定义... 3 二.现状与需要解决的问题... 3 三.为什么使用AJAX. 4 四.谁在使用AJAX. 6 五.用AJAX改进你的设计... 6 例子1:数据 ...
最新文章
- Ubuntu下修改DNS重启也能用的方法
- Nhibernate 3.0 cookbook学习笔记 一对多与多对多映射
- android 请求参数打印,Android开发-----关于解决Retrofit打印HttpLog和设置连接超时的问题...
- 从0到1写RT-Thread内核——空闲线程与阻塞延时的实现
- 西门子rwd68温控器说明书_西门子RWD68说明书
- 为什么引入Memcached?
- 前端开发必备:js中的sort()排序函数
- multipart/form-data
- DB-Engines:Snowflake荣获2021年的年度DBMS
- 带你了解几种二进制代码相似度比较技术
- python tree 库_Python——tree
- c语言程序改错:求两个整数的最小公倍数,【C语言】求两个整数的最大公约数、最小公倍数...
- 洛谷1031 均分纸牌 解题报告
- cad lisp程序大集_AUTO CAD 命令大集
- linux 中文排版,Latex中文排版——XeLatex的用法
- Linux中常用的scree的安装和常用的screen命令
- c/c++ 实现三角函数(不使用库函数) sin/cos/tan/cot
- C语言超级搞笑的代码,冷笑话我们程序员也会讲的啊!
- Kaggle案例泰坦尼克号问题
- 携程Java后台开发三面面经
热门文章
- 多目标数据关联基本方法
- Ample Sound Ample Guitar Metal Hellrazer Mac - 虚拟九弦金属吉他
- Kontakt 6 for Mac(强大的音频采样器软件)
- Mac openssl 开发环境测试
- Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
- Kubernetes - - k8s - v1.12.3 一键部署高可用 Prometheus 并实现邮件告警
- mongodb常用命令脚本化-自动化运维
- 水题 Codeforces Beta Round #70 (Div. 2) A. Haiku
- 【Daily Scrum】12-25
- 基于 pureXML 技术的数据库表结构扩展