Authorization Filter Authorization是五种Filter中优先级最高的,通常用于验证Request合不合法,不合法后面就直接跳过。 权限控制器过滤器,可以通过Authonization可以实现复杂的权限角色认证、登录授权等操作实现事例如下: public class AuthonizationFilter :Attribute,IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { //这里可以做复杂的权限控制操作 if (context.HttpContext.User.Identity.Name != "1") //简单的做一个示范 { //未通过验证则跳转到无权限提示页 RedirectToActionResult content = new RedirectToActionResult("NoAuth", "Exception", null); context.Result = content; } } } Resource Filter Resource是第二优先,会在Authorization之后,Model Binding之前执行。通常会是需要对Model加工处理才用。 public class AuthonizationFilter :Attribute,IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { //这里可以做复杂的权限控制操作 if (context.HttpContext.User.Identity.Name != "1") //简单的做一个示范 { //未通过验证则跳转到无权限提示页 RedirectToActionResult content = new RedirectToActionResult("NoAuth", "Exception", null); context.Result = content; } } } Exception Filter 异常处理的Filter,可以进行全局的异常日志收集等操作,使用该过滤器需要实现 IExceptionFilter接口,实现这个接口需要实现OnException方法,当系统发送未捕捉的异常时候就会触发这个方法,这个方法里面包含了一个ExceptionContext异常上下文,其中包含了具体的异常信息,然后就需要使用日志组件等记录下这个异常。 public class ExecptionFilter : Attribute, IExceptionFilter { private ILogger<ExecptionFilter> _logger; //构造注入日志组件 public ExecptionFilter(ILogger<ExecptionFilter> logger) { _logger = logger; } public void OnException(ExceptionContext context) { //日志收集 _logger.LogError(context.Exception, context?.Exception?.Message??"异常"); } } Action Filter 最常使用的Filter,封包进出都会经过它,使用上没什么需要特别注意的。跟Resource Filter很类似,但并不会经过Model Binding。 可以通过ActionFilter拦截每个执行方法进行一系列的操作,比如:执行日志、参数验证、权限控制等一系列操作。使用Action Filter 需要实现IActionFilter 抽象接口,IActionFilter 接口要求实现OnActionExecuted 和OnActionExecuting 方法 public class ActionFilter : Attribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext context) { //执行完成.... } public void OnActionExecuting(ActionExecutingContext context) { //执行中... } } Result Filter 当Action完成后,最终会经过的Filter,可以对结果进行格式化、大小写转换等一系列操作。 public class ResultFilter : Attribute, IResultFilter { public void OnResultExecuted(ResultExecutedContext context) { // 在结果执行之后调用的操作... } public void OnResultExecuting(ResultExecutingContext context) { // 在结果执行之前调用的一系列操作 } }