一、过滤器简介

1.1、理解什么是过滤器
1、过滤器(Filters)就是向请求处理管道中注入额外的逻辑。提供了一个简单而优雅的方式来实现横切关注点。
2、所谓的过滤器(Filters),MVC框架里面的过滤器完全不同于ASP.NET平台里面的Request.Filters和Response.Filter对象,它们主要是实现请求和响应流的传输。通常我们所说的过滤器是指MVC框架里面的过滤器。
3、过滤器可以注入一些代码逻辑到请求处理管道中,是基于C#的Attribute的实现。当负责调用Action的类ControllerActionInvoker在调用执行Action的时候会检查Action上面的Attribute并查看这些Attribute是否实现了指定的接口,以便进行额外的代码注入处理
1.2、理解为什么要使用过滤器
假设你做了一个小项目,其中某个功能是操作管理用户信息模块,有这样一个需求,对用户信息管理必须是已通过认证的用户才能操作,我们可以在每一个Action方法里面检查认证请求,如下所示:
using MvcFilterDmo.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
namespace MvcFilterDmo.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
if (!Request.IsAuthenticated)
{
FormsAuthentication.RedirectToLoginPage();
}
//操作部分...
return View();
}
public ActionResult Insert()
{
if (!Request.IsAuthenticated)
{
FormsAuthentication.RedirectToLoginPage();
}
//操作部分...
return View();
}
public ActionResult Update()
{
if (!Request.IsAuthenticated)
{
FormsAuthentication.RedirectToLoginPage();
}
//操作部分...
return View();
}
public ActionResult Delete()
{
if (!Request.IsAuthenticated)
{
FormsAuthentication.RedirectToLoginPage();
}
//操作部分...
return View();
}
//其他Action操作方法
//...
}
}
通过上面的代码,可以发现使用这种方式检查请求认证有许多重复的地方,这也就是为什么要使用过滤器的原因,使用过滤器可以实现相同的效果。如下所示:
using MvcFilterDmo.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
namespace MvcFilterDmo.Controllers
{
[Authorize]
public class HomeController : Controller
{
public ActionResult Index()
{
//操作部分...
return View();
}
public ActionResult Insert()
{
//操作部分...
return View();
}
public ActionResult Edit()
{
//操作部分...
return View();
}
public ActionResult Delete()
{
//操作部分...
return View();
}
//其他Action操作方法
//...
}
}
过滤器是.NET里面的特性(Attributes),它提供了添加到请求处理管道的额外方法。这里使用Authorize过滤器可以实现同样的效果,不过代码就显然比之前更加简洁优雅。
二、过滤器的使用
2.1、基本类型的过滤器
过滤器实现的机制:在MVC框架调用一个Action之前,它会检查方法的定义中是否实现了特性(Attributes),如果实现的话,那么在请求处理管道适当的位置,该特性定义的方法会被调用。
ActionFilterAttribute类既实现了IactionFilter接口,也实现IResultFilter接口。这是一个抽象类,它要求你必须提供一个实现。AuthorizeAttribute和HandleErrorAttribute类,则包含了一些有用的特性,并且可以不必创建派生类进行使用。
2.2、过滤器的应用、应用方式以及执行顺序
应用: 过滤器可以被应用到控制器上也可以用到Action方法上,应用到控制上时,表示所有的Action方法都有了这个过滤器,并且可以混合使用,或多次使用,如下所示:
[A] //表示所有的Action方法都会应用A过滤器
Public class DemoController:Controller
{
[B]//B,C过滤器只作用于此Action方法,但它也会有A过滤器的应用效果
[C]
Public ActionResult Index()
{
//操作部分...
return View();
}
}
应用方式:特性的方式,如上面代码所示。
执行顺序:相同类型过滤器,执行顺序靠近方法的先执行,不同类型的过滤器一般执行顺序为【authorize--->action--->actionResult】至于异常过滤器不分先后,只要抛出异常时就会执行异常过滤器。如果要调整执行顺序,可以通过调整Order方法值大小来控制执行顺序,值越小,越先执行。下图是Action/Result过滤器应用的执行顺序图
(1)、相同类型过滤器应用示例:两个自定义Action过滤器MyFirstFilter,MyThreeFilter应用到同一个Action方法Index上。
Three控制器代码如下:
MyFirstFilter 代码如下:
MyThreeFilter代码如下:
运行结果如下:
(2)、不同类型过滤器应用示例:有一个自定义Action过滤器MyFirstFilter,有一个自定义Result过滤器MySecondFilter,应用到同一个Action方法Index上。
Three控制器代码如下:
MyFirstFilter 代码如下:
MySecondFilter代码如下:
运行结果如下:
看完上面的解释,可能你现在对这些过滤器的执行顺序,以及如何自定义过滤器还不明白,不要紧,下面我们会逐一介绍这几个基本的过滤器的使用,以及如何自定义过滤器。
2.3、使用授权过滤器
所有实现了IAuthorizationFilter接口的都可以称之为授权过滤器:其定义如下:
public interface IAuthorizationFilter
{
void OnAuthorization(AuthorizationContext filterContext);
}
由于MVC框架系统自带的AuthorizeAttribute实现有一些突出的功能,而这种牵涉到安全的代码一定要谨慎的编写,所以一般我们不会直接实现这个接口,而是去继承AuthorizeAttribute这个类,并重写其AuthorizeCore方法,签名为: bool AuthorizeCore(HttpContextBase httpContext) 而处理授权失败的时候,可以重写其HandleUnauthorizedRequest方法,其签名为: void HandleUnauthorizedRequest(AuthorizationContext context) 。注意:验证与授权是两回事,验证发生在授权之前。
默认的授权过滤器已经有了验证的功能,其验证的机理是利用Asp.net平台自带的验证机制,如表单验证和Windows验证。除了验证功能,它本身还有授权的功能。授权过滤器是所有过滤器中最早运行的。
经过Route到达了控制器的时候,在调用Action之前,MVC框架会检测在相关的Action上是否有授权过滤器,如果有会调用OnAuthorization方法,如果此方法批准了请求,才会调用相应的Action。
使用授权过滤器几种情况如下:
1.直接在Action上或者控制器上加Authorize,表示启用了验证,但不牵涉到授权。
2.添加Authorize(Users=“a,b”)],表示启用了验证,并且也启用了授权,只有a或者b用户能访问此控制器。
3.当添加Authorize(Roles=“admin,Member”)]时的步骤如下:
---利用asp.net自带的角色提供者,或者实现自己的角色提供者,实现自己的角色提供者时,只需要集成RoleProvider类型,并实现其中的所有方法或部分方法,最好实现所有方法。
---在Web程序的根目录的Web.config文件中配置角色管理者。
---在适当的Action中利用Roles类型来访问自己创建的RoleProvider中的相关方法。
使用内置的授权过滤器
MVC框架内置的授权过滤器AuthorizeAttribute,它允许我们使用这个类的两个公共属性来指定授权策略,如下所示:
Users和Roles两者是并且的关系,例如Users=“a,b,c”,Roles=“admin”,表示用户是a,b,c 其中一个并且是Admin角色才能访问。
创建自定义的授权过滤器
方式一:直接实现IAuthorizationFilter接口,但不推荐这样做,因为牵涉到安全方面的代码。
方式二:继承AuthorizeAttribute这个类,并重写其AuthorizeCore方法,签名为: bool AuthorizeCore(HttpContextBase httpContext),代码如下所示:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
private string[] allowedUsers;
public MyAuthorizeAttribute(params string[] users)
{
allowedUsers = new string[] { "admin", "user1", "xf" };
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return httpContext.Request.IsAuthenticated &&allowedUsers.Contains(httpContext.User.Identity.Name,
StringComparer.InvariantCultureIgnoreCase);
}
}
2.4、使用动作过滤器
动作过滤器是可以以用于任何目的的多用途过滤器,创建自定义动作过滤器需要实现IActionFilter接口,该接口代码如下所示:
该接口定义了两个方法,MVC框架在调用动作方法之前,会调用OnActionExecting方法。在调用动作方法之后,则会调用OnActionExecuted方法。
实现OnActionExecting方法
参数ActionExecutingContext对象继承于ControllerContext,其中的2个属性:
ActionDescriptor:提供了关于Action方法的相关信息
Result:类型为ActionResult,通过给这个属性设置一个非null的值就可以取消这个请求。
我们可以用过滤器来取消一个请求,通过设置Result属性即可。代码如下所示:
public class MyActionFilterAttribute : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
if(filterContext.HttpContext.Request.IsLocal)
{
filterContext.Result = new HttpNotFoundResult();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//未做实现
}
}
这个例子通过用OnActionExecuting方法检查请求是否来自本地机器,如果是,编队用户返回一个“404”未找到的响应。运行结果如下图:
实现OnActionExecuted方法
我们也可以通过OnActionExecuted方法来执行一些跨越动作方法的任务,下面这个例子是计算动作方法运行的时间,代码如下:
public class MyActionFilterAttribute : FilterAttribute, IActionFilter
{
private Stopwatch timer;
public void OnActionExecuting(ActionExecutingContext filterContext)
{
timer = Stopwatch.StartNew();
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
timer.Stop();
if (filterContext.Exception == null)
{
filterContext.HttpContext.Response.Write(
string.Format("动作方法延迟的时间: {0}",
timer.Elapsed.TotalSeconds));
}
}
}
}
我们将自定义的动作过滤器MyActionFilter应用到HomeController的Index方法上,运行结果如下:
2.5、使用结果过滤器
结果过滤器是多用途的过滤器,他会对动作方法所产生结果进行操作,结果过滤器实现IResultFilter接口,创建自定义结果过滤器需要现IResultFilter接口,该接口代码如下所示:
当结果过滤器运用于一个动作方法时,会在动作方法返回动作结果之前,调用OnResultExecuting方法,在返回动作结果之后,会调用OnResultExecuted方法。下面这个例子是计算动作方法返回结果运行的时间,代码如下:
public class MyResultFilterAttribute : FilterAttribute, IResultFilter
{
private Stopwatch timer;
public void OnResultExecuting(ResultExecutingContext filterContext)
{
timer = Stopwatch.StartNew();
}
public void OnResultExecuted(ResultExecutedContext filterContext)
{
timer.Stop();
filterContext.HttpContext.Response.Write(string.Format("结果执行延迟时间: {0}", timer.Elapsed.TotalSeconds));
}
}
我们将自定义的结果过滤器MyResultFilter应用到HomeController的Index方法上,运行结果如下:
需要注意的是:动作过滤器是运行在页面输出之前,结果过滤器是运行在页面输出之后。
2.6、使用异常过滤器
异常过滤器只有在调用一个动作方法而抛出未处理的异常才会运行,这种异常来自以下位置:
A、另一种过滤器(授权、动作、或结果过滤器)。
B、动作方法本身。
C、当动作结果被执行时。
使用内置的异常过滤器
HandleErrorAttribute(处理程序错误特性),它是MVC内嵌的异常过滤器,有以下3个重要的属性:
1.ExceptionType:类型为Type,表示希望被此过滤器处理的异常类型,包括其子类型,默认值为System.Exception
2.View:类型为string,表示此过滤器呈递的视图页面,默认值为Error
3.Master:呈递的视图页的母板页,如果不指定,视图会用其默认的母版页
内嵌的HandleErrorException只有在配置文件Web.config中配置的CustomError 的mode设置为on的时候才生效(其默认模式为RemoteOnly),如下图所示:
此过滤器还会给视图传递一个HandleErrorInfo类型的对象给视图,以便视图可以显示一些额外的关于错误的信息。下面是使用异常过滤器的示例。
应用到Index动作方法上:
在Views/Shared文件夹下添加一个显示异常信息的视图页SpecialError.cshtml,页面代码如下:
@model HandleErrorInfo
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>SpecialError</title>
</head>
<body>
<div>
<p>
There was a<b>@Model.Exception.GetType().Name</b>
while rendering<b>@Model.ControllerName</b>'s
<b>@Model.ActionName</b> action
</p>
</div>
</body>
</html>
运行结果如下:
创建自定义的异常过滤器
如果我们对异常过滤器有特殊的需求,可以通过自定义的异常过滤器来完成,创建自定义异常过滤器必须实现IExceptionFilter接口,该接口代码如下:
当一个未知处理异常发生时,OnException方法会被调用。该方法的传递一个ExceptionContext对象,派生于ControllerContext类,定义了一些额外的过滤器专有属性如下表所示:
抛出的异常通过Exception属性是可以访问的。通过把ExceptionHandled属性设置为true,一个异常过滤器可以报告它已经处理了该异常,应用于一个动作的所有异常过滤器都会被调用。
需要注意的是:如果一个动作方法的所有异常过滤器均为把ExceptionHandled属性设置为true,MVC框架将使用默认的ASP.NET异常处理程序。
Result属性有异常过滤器使用,以告诉MVC框架要做什么,异常过滤器的两个主要应用是记录该异常到日志,并把适当的消息显示给用户。下面的代码将演示通过创建一个自定义的异常过滤器,当一个特定的钟类的未处理异常出现时,把该用户重定向到一个指定的错误页面。
public class MyExectionAttribute:FilterAttribute,IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if(!filterContext.ExceptionHandled&&
filterContext.Exception is NullReferenceException)
{
filterContext.Result = new RedirectResult("~/Content/SpecialErrorPage.html");
filterContext.ExceptionHandled = true;
}
}
}
然后在项目根目录添加一个名为Content的文件夹,在该文件夹下创建SpeciErrorPage.html文件,当异常被处理时,将以这个错误页面显示个用户。该页面代码如下:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <h1>Sorry</h1> <p>this is a Excetption test</p> There was aNullReferenceException while renderingHome's Index action </body> </html>
在控制器中应用MyExection异常过滤器,并主动让其抛出一个空引用异常,以便测试。
public class HomeController : Controller
{
[MyExection]
public ActionResult Index()
{
throw new NullReferenceException();
}
}
运行结果如下:
总结:本文章简单总结了对过滤器的理解以及如何使用MVC框架内置基本的过滤器和如何自定义过滤器及应用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# asp.net
# mvc
# 过滤器
# .net
# mvc5
# ASP.NET过滤器的应用方法介绍
# ASP.NET Core MVC 过滤器的使用方法介绍
# ASP.NET mvc4中的过滤器的使用
# ASP.NET Core MVC 过滤器(Filter)
# 聊一聊Asp.net过滤器Filter那一些事
# ASP.NET Core MVC中过滤器工作原理介绍
# ASP.NET MVC过滤器执行顺序介绍
# ASP.NET Core中ResourceFilter过滤器的实现
# 自定义
# 所示
# 抛出
# 可以通过
# 自己的
# 重写
# 的是
# 用过
# 实现了
# 设置为
# 才会
# 我们可以
# 可以实现
# 自带
# 但不
# 需要注意
# 要使
# 不同类型
# 值为
# 如下图
相关文章:
官网网站制作腾讯审核要多久,联想路由器newifi官网
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何通过建站之星自助学习解决操作问题?
如何在宝塔面板中创建新站点?
高防服务器租用首荐平台,企业级优惠套餐快速部署
魔毅自助建站系统:模板定制与SEO优化一键生成指南
代刷网站制作软件,别人代刷火车票靠谱吗?
香港网站服务器数量如何影响SEO优化效果?
如何高效搭建专业期货交易平台网站?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
太平洋网站制作公司,网络用语太平洋是什么意思?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
开心动漫网站制作软件下载,十分开心动画为何停播?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
如何快速生成ASP一键建站模板并优化安全性?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
,柠檬视频怎样兑换vip?
如何规划企业建站流程的关键步骤?
如何在西部数码注册域名并快速搭建网站?
建站之星如何修改网站生成路径?
宿州网站制作公司兴策,安徽省低保查询网站?
广州营销型建站服务商推荐:技术优势与SEO优化解析
建站之星安装后界面空白如何解决?
如何高效利用200m空间完成建站?
建站主机选择指南:服务器配置与SEO优化实战技巧
如何通过商城免费建站系统源码自定义网站主题?
平台云上自主建站:模板化设计与智能工具打造高效网站
山东云建站价格为何差异显著?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
建站之星如何通过成品分离优化网站效率?
股票网站制作软件,网上股票怎么开户?
无锡营销型网站制作公司,无锡网选车牌流程?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
建站主机是否等同于虚拟主机?
网站专业制作公司有哪些,做一个公司网站要多少钱?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
如何用免费手机建站系统零基础打造专业网站?
javascript基本数据类型及类型检测常用方法小结
江苏网站制作公司有哪些,江苏书法考级官方网站?
如何在IIS7上新建站点并设置安全权限?
家庭服务器如何搭建个人网站?
如何批量查询域名的建站时间记录?
如何通过网站建站时间优化SEO与用户体验?
seo网站制作优化,网站SEO优化步骤有哪些?
如何在云主机上快速搭建网站?
网站网页制作专业公司,怎样制作自己的网页?
如何通过可视化优化提升建站效果?
建站10G流量真的够用吗?如何应对访问高峰?
*请认真填写需求信息,我们会在24小时内与您取得联系。