.Net6 filter 的实现
//.NetCore 中的Filter 按照执行优先级排列
//权限过滤器:它在Filter Pipleline中首先运行,并用于决定当前用户是否有请求权限。如果没有请求权限直接返回。
IAuthorizationFilter
//资源过滤器: 它在Authorzation后面运行,同时在后面的其它过滤器完成后还会执行。Resource filters 实现缓存或其它性能原因返回。因为它运行在模型绑定前,所以这里的操作都会影响模型绑定。 据说都是在这里做缓存页面 ,我做的网站大多时效性较强,就没亲自实验,百度教程很多
IResourceFilter
//方法过滤器:它会在执行Action方法前后被调用。这个可以在方法中用来处理传递参数和处理方法返回结果。 (这个大家想必最常用了吧)
ActionFilterAttribute
//异常过滤器:被应用全局策略处理未处理的异常发生前异常被写入响应体
ExceptionFilterAttribute
//结果过滤器:它可以在执行Action结果之前执行,且执行Action成功后执行,使用逻辑必须围绕view或格式化执行结果。
ResultFilterAttribute
//program.cs注册
Action<MvcOptions> filters = new Action<MvcOptions>(r=> {
r.Filters.Add(typeof(MyAuthorization));
r.Filters.Add(typeof(MyExceptionFilterAttribute));
r.Filters.Add(typeof(MyResourceFilterAttribute));
r.Filters.Add(typeof(MyActionFilterAttribute));
r.Filters.Add(typeof(MyResultFilterAttribute));
});
services.AddMvc(filters) //注册全局过滤器
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
注意注意 如果 filter 使用了构造函数注入参数 在局部使用的话就不能使用 直接打标签 要使用一下这种方式
public class MyActionFilterAttribute : ActionFilterAttribute
{
private ILogger<MyActionFilterAttribute> _logger;
public MyActionFilterAttribute(ILogger<MyActionFilterAttribute> logger)
{
this._logger = logger;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
_logger.LogWarning("在这里执行了Action方法");//记录日志
}
}
//没有用上面那种构造函数注入的话就可以正常打标签 设置过滤器 像这样 [MyActionFilter]
[TypeFilter(typeof(MyActionFilterAttribute))] //这时候需要这样使用
public class HomeController : Controller
{
public IActionResult Index()
{
ViewBag.Now = DateTime.Now.ToString();
return View();
}
}