笨鸟先飞之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浏览器(操作 ...
随机推荐
- Java课程设计----仿Windows标准型计算器
JAVA课程设计 仿Windows标准型计算器(By Yanboooooooo) 一.团队介绍: 连燕波[组长]:网络1513学生. 张文博[组员]:网络1513学生. 二.项目git地址 码云项目地 ...
- 使用C#编写SqlHelper类
无聊的周末,学习.编码无力.想找点事干但又不知道干点什么,猛然发现自己学过的SqlHelper快忘记了.于是乎虎躯一震心想怎能如此堕落下去,立马打开电脑,双手摸上键盘.写下此文作为学习过程中的复习,并 ...
- C#设计模式之二简单工厂模式(过渡模式)
一.引言 之所以写这个系列,是了为了自己更好的理解设计模式,也为新手提供一些帮助,我都是用最简单的.最生活化的实例来说明.在上一篇文章中讲解了单例模式,今天就给大家讲一个比较简单的模式--简单工厂模式 ...
- php显示距当前多长时间
<?php header("Content-type: text/html; charset=utf-8");date_default_timezone_set('PRC') ...
- android自定义动画
前一篇说了实现过程,这次来写一个自己简单实现的3d动画 先来属性声明配置,方便使用xml 文件来定制动画 <!-- 有些类型其实是没必要的,只是实例代码,为了更具有代表性 --> < ...
- day16<集合框架+>
集合框架(去除ArrayList中重复字符串元素方式) 集合框架(去除ArrayList中重复自定义对象元素) 集合框架(LinkedList的特有功能) 集合框架(栈和队列数据结构) 集合框架(用L ...
- Azure SQL Database (25) Azure SQL Database创建只读用户
<Windows Azure Platform 系列文章目录> 本文将介绍如何在Azure SQL Database创建只读用户. 请先按照笔者之前的文章:Azure SQL Databa ...
- 语音传输之RTP/RTCP/UDP及软件实现关键点
语音通信是实时通信,一定要保证实时性,不然用户体验会很糟糕.IETF设计了RTP来承载语音等实时性要求很高的数据,同时设计了RTCP来保证服务质量(RTP不保证服务质量).在传输层,一般选用UDP而不 ...
- oracle pl/sql 存储过程
存储过程用于执行特定的操作,当建立存储过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数,可以将执行部分的数据传递到 ...
- Lodop 动态加载模板,动态加载数据
最近需要使用Lodop打印控件,所以就研究了一下,期间从网上找了诸多的东西,基本全是对HTML进行打印的,没有找到我想要的,就只好自己动手丰衣足食. 这篇文章主要讲述的是Lodop与数据的结合使用,官 ...