Filter 主要有以下5种 分别是验证、资源、动作、异常捕获、结果。
1. Authorization 主要用于身份验证。
2.Resource 发生在控制器实例之前。
3、Action 发生在Action (事件 方法) 之前。(主要用于日记 )
4. Exception 主要是捕获异常.
5. Result Filter : 发生在视图替换环节
有以下五种Filter 可以使用: - Authorization Filter: Authorization是五种Filter中优先级最高的,通常用于验证Request合不合法,不合法后面就直接跳过。 - Resource Filter:Resource是第二优先,会在Authorization之后,Model Binding之前执行。通常会是需要对Model加工处理才用。 - Exception Filter:异常处理的Filter。 - Action Filter:最常使用的Filter,封包进出都会经过它,使用上没什么需要特别注意的。跟Resource Filter很类似,但并不会经过Model Binding。 - Result Filter:当Action完成后,最终会经过的Filter。
1 Authonization Filter
权限控制过滤器 通过 Authonization Filter 可以实现复杂的权限角色认证
、登陆授权
等操作 实现事例代码如下:
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;
}
}
}
2 Resource Filter
资源过滤器 可以通过Resource Filter 进行资源缓存
、防盗链
等操作。 使用Resource Filter 要求实现IResourceFilter 抽象接口
public class ResourceFilter : Attribute,IResourceFilter
{
public void OnResourceExecuted(ResourceExecutedContext context)
{
// 执行完后的操作
}
public void OnResourceExecuting(ResourceExecutingContext context)
{
// 执行中的过滤器管道
}
}
3 Exception Filter
通过Execption Filter 过滤器可以进行全局的异常日志收集
等操作。
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??"异常");
}
}
4 Action Filter
作用:可以通过ActionFilter 拦截 每个执行的方法进行一系列的操作,比如:执行操作日志
、参数验证
,权限控制
等一系列操作。
使用Action Filter 需要实现IActionFilter 抽象接口,IActionFilter
接口要求实现OnActionExecuted
和OnActionExecuting
方法
public class ActionFilter : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
//执行完成....
}
public void OnActionExecuting(ActionExecutingContext context)
{
//执行中...
}
}
5 Result Filter
结果过滤器,可以对结果进行格式化、大小写转换等一系列操作。
public class ResultFilter : Attribute, IResultFilter
{
public void OnResultExecuted(ResultExecutedContext context)
{
// 在结果执行之后调用的操作...
}
public void OnResultExecuting(ResultExecutingContext context)
{
// 在结果执行之前调用的一系列操作
}
}
过滤器的注册方式(使用方式)
1。 Action 注册方式:
[AuthonizationFilter()]
public IActionResult Index()
{
return View();
}
2 Controller 注册方式
[AuthonizationFilter()]
public class FirstController : Controller
{
private ILogger<FirstController> _logger;
public FirstController(ILogger<FirstController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
}
3 全局注册方式
public void ConfigureServices(IServiceCollection services)
{
//全局注册异常过滤器
services.AddControllersWithViews(option=> {
option.Filters.Add<ExecptionFilter>();
});
services.AddSingleton<ISingletonService, SingletonService>();
}
4 TypeFilter 和 ServiceFilter 注册方式
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??"异常");
}
}
TypeFilter 使用方式
滤器中构造函数中存在参数,需用到TypeFilter
[TypeFilter(typeof(ExecptionFilter))]
public IActionFilter Index2()
{
return View();
}
ServiceFilter 使用方式
控制器中的代码如下:
[ServiceFilter(typeof(ExecptionFilter))]
public IActionFilter Index2()
{
return View();
}
注册服务的代码
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
Console.WriteLine("ConfigureServices");
services.AddControllersWithViews();
//services.AddControllersWithViews(option=> {
// option.Filters.Add<ExecptionFilter>();
//});
//注册过滤器服务,使用ServiceFilter 方式必须要注册 否则会报没有注册该服务的相关异常
services.AddSingleton<ExecptionFilter>();
}