学习ASP.Net的过滤器
过滤器是.NET的特性,它添加额外的步骤到请求处理管道中,是派生自System.Attribute的特殊类. 可以把他们附加到代码元素中,这些元素包括:classes, methods, properties, and fields. 它的目的是插入额外的信息到你编译的代码中,并且你可在运行时读取到。
MVC 框架支持四种不同的过滤器:
一、使用Authorization 过滤器
Authorization 过滤器实现IAuthorizationFilter 接口,该接口的定义如下:
public interface IAuthorizationFilter { void OnAuthorization(AuthorizationContext filterContext); } |
其中AuthorizationContext 继承ControllerContext
关于ControllerContext的属性如下:
AuthorizationContext提供了两个额外的属性:
1.ActionDescriptor是 ActionDescriptor类型,提供了方法的详细情况
2.Result 是ActionResult类型,方法的结果,过滤器可以设置这个值为空从而取消整个请求。
首先让我们了解这个过滤器是怎么工作的:当MVC应用程序从客户端浏览器接受到一个请求后,首先由路由系统处理请求的URL,然后从routing system处理的结果中提取控制器和方法的名字,接着开始实例化一个被请求的控制器,但是在请求的方法被调用之前,MVC框架会去查找是否有Authorization 过滤器被附加到该请求的方法中。如果有的话,那么实现了IAuthorizationFilter接口的类中的OnAuthorization将会被调用,当Authorization 过滤器批准该请求,程序将进入处理的下一个管道,否则,这个请求将会被拒绝。
定义一个验证失败的处理策略:考虑到AJAX的请求方式
public class AjaxAuthorizeAttribute : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext context) { if (context.HttpContext.Request.IsAjaxRequest()) { UrlHelper urlHelper = new UrlHelper(context.RequestContext); context.Result = new JsonResult { Data = new { Error = "NotAuthorized" , LogOnUrl = urlHelper.Action( "LogOn" , "Account" ) }, JsonRequestBehavior = JsonRequestBehavior.AllowGet}; } else { base .HandleUnauthorizedRequest(context); } } } |
二、使用Exception 过滤器
只有在调用方法的过程中抛出异常后Exception过滤器才会运行
public interface IExceptionFilter { void OnException(ExceptionContext filterContext); } |
与AuthorizationContext 一样ExceptionContext 继承于ControllerContext,ExceptionContext 的额外属性如下:
可以这样构建一个强类型的输出错误数据的视图,如下:
@Model HandleErrorInfo @{ ViewBag.Title = "Sorry, there was a problem!"; } < p > There was a < b >@Model.Exception.GetType().Name</ b > while rendering < b >@Model.ControllerName</ b >'s < b >@Model.ActionName</ b > action. </ p > < p > The exception message is: < b ><@Model.Exception.Message></ b > </ p > < p >Stack trace:</ p > < pre >@Model.Exception.StackTrace</ pre > |
二、使用Action过滤器
Action和result过滤器是能实现任何目的的过滤器,这两种过滤器使用同一个模式,内置的IActionFilter接口实现这两种类型 。
public interface IActionFilter { void OnActionExecuting(ActionExecutingContext filterContext); void OnActionExecuted(ActionExecutedContext filterContext); } |
1.实现OnActionExecuting方法
The OnActionExecuting method is called before the action method is invoked. You can use this opportunity to inspect the request and elect to cancel the request, modify the request, or start some activity that will span the invocation of the action。
ActionExecutingContext 的额外属性:ActionDescriptor和Result
实现OnActionExecuting 方法取消某个请求:
using System.Web.Mvc; namespace MvcFilters.Infrastructure.Filters { public class MyActionFilterAttribute : FilterAttribute, IActionFilter { public void OnActionExecuting(ActionExecutingContext filterContext) { if (!filterContext.HttpContext.Request.IsSecureConnection) { filterContext.Result = new HttpNotFoundResult(); } } public void OnActionExecuted(ActionExecutedContext filterContext) { // do nothing } } } |
在这个例子中,我们使用OnActionExecuting 方法检查请求是否使用了SSL安全策略,如果没有就返回404给客户端浏览器。
2.实现OnActionExecuted方法
ActionExecutedContext 的额外属性如下:
四、使用Result过滤器
public interface IResultFilter { void OnResultExecuting(ResultExecutingContext filterContext); void OnResultExecuted(ResultExecutedContext filterContext); } |
推荐使用内置的过滤器: