.NET MVC全局异常处理(一)

时间:2022-11-08 13:15:42

.NET MVC全局异常处理

一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就可以,结果实际使用的时候还是遇到不少问题,所以要记录一下。

IIS配置

刚开始不想改程序代码,所以直接就想到了IIS里面的错误页配置配置,一开始反复测试,设置改了很多,但是没有效果,后来发现是静态页的配置,还没有进入MVC的程序部分,所以对于.NET MVC这种动态页是不生效的,应该使用.NET错误页选项

静态错误页配置

静态页配置流程如下:

.NET MVC全局异常处理(一)

.NET MVC全局异常处理(一)

.NET MVC全局异常处理(一)

如上图所示,IIS中配置对错误的响应有三种方式,默认情况是第三个,本地访问显示详细错误信息,外部地址访问显示自定义页面,这样方便开发者调试,如果没有设置专门的错误页会使用IIS自带的样式,也就是第二张图中的配置,根据路径我们可以找到这样一个文件夹,里面都是错误提示的静态页,对应不同的状态代码

.NET MVC全局异常处理(一)

我们可以把IIS设置为均使用自定义错误页看下效果,或者直接通过文件访问

.NET MVC全局异常处理(一)

.NET MVC全局异常处理(一)

上面那张是详细的静态404错误,可以看到会暴露我们系统路径,下面则是默认的自定义错误页

静态错误的默认页有相应的设置,看似可以修改,有“文件”、“执行URL”、“重定向”三种,但是实际设置一下就会发现报错:锁定错误

.NET MVC全局异常处理(一)

通过这个错误我们去搜索解决方法可以看到一些人说将web.config中的httperror节下的defaultPath解锁即可,但似乎这是IIS7以前的设置,在IIS10中并没有相应的选项,看到一些说明提到可能是官方使用了更加安全的管理机制,因为发现这边的配置是静态页相关,不符合我的需要,没有深入研究,如果一定要使用这种可以看看这篇博客,试试能否通过系统命令解决锁定的问题

win7 IIS Web.config节点锁定问题

.NET错误页配置

.NET错误页的设置与静态页差不多,除了入口不一样,配置的选项也不太相同,但是整体意思一样

.NET MVC全局异常处理(一)

.NET MVC全局异常处理(一)

可以看到这里要求是绝对URL,所以实际使用起来应该是不太方便,所以没有找到太多相关资料。另外,需要web.conig中的customError设为On,部分异常如500会自动跳转到MVC的默认错误页Home/Error

.NET MVC全局异常处理(一)

使用IIS的错误页处理虽然不用改代码,但是维护起来局限性很多,最终还是应该通过程序进行全局异常捕获

程序设置

通过程序控制的方法我想到两种,一个是使用全局配置文件Global.asax中的Application_Error方法,另一个是使用MVC的过滤器,默认的四种过滤器中就包含异常过滤

全局异常配置

这种方法对于WebForm和MVC都是通用的,在ASP.NET中,只要网站程序抛出未捕获的异常都会触发Application_Error事件。

使用此方法一定要把GlobalFilter全局过滤器中的HandleErrorAttribute注册取消掉,也可以将配置文件中的customErrors节点关闭,否则HTTP 500的错误将不会被Application_Error事件捕获。

.NET MVC全局异常处理(一)

.NET MVC全局异常处理(一)

捕获到异常之后我们可以很容易地跳转到静态页面

protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
var httpStatusCode = (exception as HttpException)?.GetHttpCode() ?? 700; //如果为空则走自定义
var httpContext = ((MvcApplication)sender).Context;
httpContext.ClearError(); switch (httpStatusCode)
{
case 404:
httpContext.Response.Redirect("~/Error/404.htm");
break;
default:
httpContext.Response.Redirect("~/Error/500.htm");
break;
}
}

在一般情况下我们也可以指向一个控制器

protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
var httpStatusCode = (exception as HttpException)?.GetHttpCode() ?? 700; //如果为空则走自定义
var httpContext = ((MvcApplication)sender).Context;
httpContext.ClearError(); var routeDic = new RouteValueDictionary
{
{"controller", "Home"},
{ "action","Error"}
};
httpContext.Response.RedirectToRoute("Default", routeDic);
}

但是在实际的业务中遇到了一些http请求的问题,在处理一部分代码抛出的异常时会出现“服务器无法在已发送HTTP标头之后······”这一系列异常,如“设置状态”、“追加标头”等,这个时候跳转要使用另一种写法

protected void Application_Error(object sender, EventArgs e)
{
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
var routeData = new RouteData();
IController controller = new HomeController();
routeData.Values.Add("controller", "Home");
routeData.Values.Add("action", "Error");
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
Response.End();
}

这里要注意的一点是如果要使用Area中的控制器不能写成routeData.Values.Add,而是使用DataTokens

routeData.DataTokens.Add("area", "TestArea");

.NET MVC全局异常处理(一)的更多相关文章

  1. .NET MVC全局异常处理(二)

    目录 .NET MVC全局异常处理(二) MVC过滤器Filter .NET MVC全局异常处理(二) 对上节的内容进行了补充 MVC过滤器Filter MVC有四种过滤器:Authorization ...

  2. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

  3. Spring MVC 全局异常处理&文件上传

    Spring MVC 全局异常处理 使用SimpleMappingExceptionResolver实现异常处理 在welcome-servlet.xml进行如下配置: <bean class= ...

  4. MVC 全局异常处理及禁用显示头

    MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...

  5. Spring MVC全局异常处理与拦截器校检

    在使用Spring MVC进行开发时,总是要对系统异常和用户的异常行为进行处理,以提供给用户友好的提示,也可以提高系统的安全性. 拦截系统响应错误 首先是拦截系统响应错误,这个可以在web.xml中配 ...

  6. MVC 全局异常处理(适用多人操作)

    自定义特性: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  7. Spring MVC全局异常处理

    继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerE ...

  8. spring mvc 全局异常处理

    package com.tool; public class MyException extends Exception{ public String Msg; public String ErrCo ...

  9. Spring MVC全局异常后返回JSON异常数据

    问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...

随机推荐

  1. python 之socket 网络编程

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  2. Jenkins进阶系列之——07更改Jenkins的主目录

    Jenkins默认会存放在用户主目录下的.jenkins文件夹中 如:Linux root用户:/root/.jenkins 注意:这是linux版本的.windows系统请自行更改.这个值在Jenk ...

  3. 机器学习笔记之人工神经网络&lpar;ANN&rpar;

    人工神经网络(ANN)提供了一种普遍而且实际的方法从样例中学习值为实数.离散值或向量函数.人工神经网络由一系列简单的单元相互连接构成,其中每个单元有一定数量的实值输入,并产生单一的实值输出. 上面是一 ...

  4. vs2013突然打不开项目,项目全部不兼容

    转载:https://forum.cocos.com/t/vs2013/40931 转载:https://jingyan.baidu.com/article/cdddd41c7c6b5353cb00e ...

  5. flume接收http请求,并将数据写到kafka

    flume接收http请求,并将数据写到kafka,spark消费kafka的数据.是数据采集的经典框架. 直接上flume的配置: source : http channel : file sink ...

  6. java06作业归档

    动手动脑 阅读QiPan.java示例程序了解如何利用二维数组和循环语句绘制五子棋盘. package 归档作业6; import java.io.*; public class QIPAN { // ...

  7. python 时间格式化

    2018-10-25 17:49:51 监控软件 原始 2018-10-2517:49:51 切割后 2018/10/25 17:49:51 格式化后 shijian = ' '.join(respo ...

  8. 解决idea控制台乱码及项目乱码

    如果控制台出现乱码,解决办法: 第1方案:.找到安装idea的路径下找idea文件下的bin中vmoptions文件,打开该文件,加上-Dfile.encoding=UTF-8 第二方案: 第3种方案 ...

  9. 浅谈iPhone OS&lpar;iOS&rpar;架构

    iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设备的操作系统

  10. linux常用命令大全2--挂载&sol;dpkg&sol;文件系统分析&sol;apt&sol;光盘&sol;关机

    挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2 ...