Web框架 --- C#中的ActionFilter
- 什么是Action Filter
- 如何定义Action Filter
- 如何使用ActionFilter
什么是Action Filter
- Action Filter 是一种用于在执行controller方法之前或之后执行自定义逻辑的机制。>* Action Filter 可以用来处理各种任务,包括但 不限于
- 日志记录、身份验证、授权、参数验证,错误处理和其他横切关注点(cross-cutting concerns)
- C# Net Core 有四种常用的Filter (按照执行顺序排列)
- Authorization filters – Implements the
IAuthorizationFilter
attribute.
- Authorization filters are used to implement authentication and authorization for controller actions. For example, the Authorize filter is an example of an Authorization filter.
- Action filters – Implements the
IActionFilter
attribute. (最常用)
- Action filters contain logic that is executed before and after a controller action executes. You can use an action filter, for instance, to modify the view data that a controller action returns.
- Result filters – Implements the
IResultFilter
attribute.
- Result filters contain logic that is executed before and after a view result is executed. For example, you might want to modify a view result right before the view is rendered to the browser.
- Exception filters – Implements the
IExceptionFilter
attribute.
- Exception filters are the last type of filter to run. You can use an exception filter to handle errors raised by either your controller actions or controller action results. You also can use exception filters to log errors.
- ActionFilter有两种方法可以执行
OnActionExecuting
在请求到达controller之前OnActionExecuted
在请求被controller处理完之后
如何定义Action Filter
- 定义一个Action Filter需要创建一个继承于
ActionFilterAttribute
的类- ActionFilterAttribute 同时实现了
IActionFilter
andIResultFilter
interfaces and 并且继承了 Filter class.
- 也就是继承了ActionFilterAttribute的类可以overide四个方法:
OnActionExecuting
– This method is called before a controller action is executed.
OnActionExecuted
– This method is called after a controller action is executed.
OnResultExecuting
– This method is called before a controller action result is executed.
OnResultExecuted
– This method is called after a controller action result is executed.
如何使用ActionFilter
全局使用
- 可以对整个Application加入全局filter,在 Startup class里的ConfigureServices method定义
public void ConfigureServices(IServiceCollection services)
{services.AddMvc(options =>{options.Filters.Add(typeof(LogActionFilter));});
}
在所有Controller上使用
[LogActionFilter]
public class HomeController : Controller
{
// Controller action methods here
}
在单个Controller上使用
[LogActionFilter]
public IActionResult Index()
{
// Controller action method logic here
}
Example
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc.Filters;public class LogActionFilter : ActionFilterAttribute
{private Stopwatch stopwatch;public override void OnActionExecuting(ActionExecutingContext context){stopwatch = Stopwatch.StartNew();}public override void OnActionExecuted(ActionExecutedContext context){stopwatch.Stop();var elapsedMilliseconds = stopwatch.ElapsedMilliseconds;var message = $"Action took {elapsedMilliseconds} ms to execute.";Debug.WriteLine(message);}
}
Filter还可以传参:
public class ResponseHeaderAttribute : ActionFilterAttribute
{private readonly string _name;private readonly string _value;public ResponseHeaderAttribute(string name, string value) =>(_name, _value) = (name, value);public override void OnResultExecuting(ResultExecutingContext context){context.HttpContext.Response.Headers.Add(_name, _value);base.OnResultExecuting(context);}
}
[ResponseHeader("Filter-Header", "Filter Value")]
public class ResponseHeaderController : ControllerBase
{public IActionResult Index() =>Content("Examine the response headers using the F12 developer tools.");// ...
Filter还可以改变request的参数
public class ValidateActionParametersAttribute : ActionFilterAttribute, IActionFilter{public override void OnActionExecuting(HttpActionContext actionExecutedContext){ var stringArgs = context.ActionArguments.Where(pair => pair.Value is string).ToList();foreach (var keyValue in stringArgs){var safeValue = ((string)keyValue.Value).Replace("\'", "");context.ActionArguments[keyValue.Key] = safeValue;}}}