一、过滤器简介
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> <p> <p> There was a<b>@Model.Exception.GetType().Name</b> while rendering<b>@Model.ControllerName</b>'s <b>@Model.ActionName</b> action </p> </p> </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进修总结之过滤器详解(图文详解)的细致内容,更多请关注ki4网别的相干文章!