笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)
概念介绍
异常过滤器主要在我们方法中出现异常的时候触发,一般我们用 异常过滤器 记录日志,或者在产生异常时做友好的处理
如果我们需要创建异常过滤器需要实现IExceptionFilter接口。
namespace System.Web.Mvc
{
//
// 摘要:
// 定义异常筛选器所需的方法。
public interface IExceptionFilter
{
//
// 摘要:
// 在发生异常时调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnException(ExceptionContext filterContext);
}
}
我们看到该接口里只有一个方法OnException,这个方法在在我们调用需要过滤的方法出现异常时触发。
OnException
我们已经知道了OnException方法是在动作方法抛出异常时被调用的那么我们就可以利用这个方法在这里对异常进行处理,比如记录日志,比如重定向在OnException方法中传递的参数是一个ExceptionContext对象,它继承于ControllerContext类,它的属性如下:
| 名称 | 类型 | 说明 |
|---|---|---|
| Exception | Exception | 获取或设置异常对象。 |
| ExceptionHandled | bool | 获取或设置一个值,该值指示是否已处理异常。。 |
| Result | ActionResult | 获取或设置操作结果。 |
执行OnException方法
下面我将演示OnException方法,首先我们还是在之前的Filter文件夹下添加一个名为 ErrorExceptionFilterAttribute.cs 的过滤器类,我们继承 FilterAttribute 类和 IExceptionFilter 接口,为了方便演示,我们简单处理,我们会在调用的方法中抛出一个异常并记录我请求的json数据
这里我们直接引用log4net来实现记录日志的功能
这是我们在 ErrorExceptionFilterAttribute.cs 文件中编写的代码
public class ErrorExceptionFilterAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
Stream inputStream = filterContext.HttpContext.Request.InputStream;
inputStream.Position = 0;
var contentEncoding= filterContext.HttpContext.Request.ContentEncoding;
var streamReader = new StreamReader(inputStream,contentEncoding);
var errorMsg = streamReader.ReadToEnd();
var logger = LogManager.GetLogger(typeof(ErrorExceptionFilterAttribute));
logger.Error(errorMsg);
var Url = new UrlHelper(filterContext.RequestContext);
var url = Url.Action("Login", "Account");
filterContext.Result = new RedirectResult(url);
}
}
在我们的动作方法抛出异常时我们在这里从接受的请求中取出json数据并保存到日志里,并把页面从新定向到登录页。
过滤器写好了接着我们去相应的方法里加上我们的异常过滤器,并且使该动作方法抛出异常
[ErrorExceptionFilter]
public ActionResult Index()
{
throw new ArgumentNullException();
}
好了我们运行程序,并且在浏览器里直接请求我们这个方法,我们看看效果

咦,我们发现页面并没有重定向到登录页而且抛了黄页这是为什么呢?这是因为我们在异常过滤器中少了一步操作我们需要把它的ExceptionHandled属性设置为true,表示我们处理过这个异常了,这样我们就能得到应用的效果了,接着我们把少的那句话加上
public class ErrorExceptionFilterAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
Stream inputStream = filterContext.HttpContext.Request.InputStream;
inputStream.Position = 0;
var contentEncoding= filterContext.HttpContext.Request.ContentEncoding;
var streamReader = new StreamReader(inputStream,contentEncoding);
var errorMsg = streamReader.ReadToEnd();
var logger = LogManager.GetLogger(typeof(ErrorExceptionFilterAttribute));
logger.Error(errorMsg);
filterContext.ExceptionHandled = true;
var Url = new UrlHelper(filterContext.RequestContext);
var url = Url.Action("Login", "Account");
filterContext.Result = new RedirectResult(url);
}
}
我们再来看看


果然还是我们熟悉的那个登录页面
接着我们去模拟一条请求,向我们的抛异常的地址发送一条json数据接着我们去看看我们的日志

总结
异常过滤器个人感觉也是很重要,毕竟我们都会犯错而一个完善的日志系统或者一个良好的处理页面,都是对错误最好的补救措施,毕竟防范于未然,我们可以在Global中配置异常过滤器让其在全局都生效。
我们如果新建一个MVC的项目我们会发现在Global中有这么一句话
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);这个表示注册全局过滤器,GlobalFilters是全局过滤器的集合,也就是说我们所有的过滤器都能通过在GlobalFilters中Add来做到全局适配。
笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)的更多相关文章
- 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)
授权过滤器 概念介绍 在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器. 我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)
概念介绍 结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行. 如果我们需要创建结果过滤器需要实现IResultFilter接口. namespa ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)
概念介绍 动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行. 如果我们需要创建动作过滤器需要实现IActionFilter接口. 我们看到该接口里有两 ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
随机推荐
- 聊一聊我的阿里云ECS云主机
javaweb学习有段时间了,期间也编写了一些自己的小webapp应用,但是都是发布在我们自己的个人pc上的. 于是我在想:怎么样让自己的项目可以发到公网上面去,让朋友们能够来访问? 我首先想到的是: ...
- python只re模块
while True: phone_number=input('please input your phone number:') if len(phone_number)==11 \ and pho ...
- Linux环境下MySQL数据库用SQL语句插入中文显示 “问号或者乱码 ” 问题解决!
问题: 在普通用户权限下执行 mysql -u root -p进入mysql数据库,中间步骤省略,插入数据:insert into 库名(属性)values('汉字'); 会出现如下提示: Quer ...
- 使用Gateway-Worker实现多人分组实时聊天 结合第三方tp
一.基础知识1.Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架.被广泛的用于手机app.移动通讯等领域的开发. 支持TCP长连接,支持Websocket.HTTP等 ...
- Azure SQL Database (25) Azure SQL Database创建只读用户
<Windows Azure Platform 系列文章目录> 本文将介绍如何在Azure SQL Database创建只读用户. 请先按照笔者之前的文章:Azure SQL Databa ...
- mongoDB学习手记2--建库、删库、插入、更新
上一篇 讲了在windows系统下的安装和启动,本文主要讲怎么建库.删库.插入.更新 在讲之前我们说一下mongoDB的一些基本概念,我们对比关系型数据库能更直观的理解 SQL术语/概念 Mongo ...
- 使用千位分隔符(逗号)表示web网页中的大数字
做手机端页面我们常常遇到数字,而在Safari浏览器下这些数字会默认显示电话号码,于是我们就用到了补坑的方法加入<meta>标签: <meta name="format-d ...
- Paint the Grid Again ZOJ - 3780 拓扑
Paint the Grid Again Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu [ ...
- hdu3695 ac自动机入门
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- OpenVPN server端配置文件详细说明(转)
本文将介绍如何配置OpenVPN服务器端的配置文件.在Windows系统中,该配置文件一般叫做server.ovpn:在Linux/BSD系统中,该配置文件一般叫做server.conf.虽然配置文件 ...