什么是Filter?
Filter工作原理

Filter类型
-
授权筛选器AuthorizationFilter: -
首先运行。 -
确定用户是否获得请求授权。 -
如果请求未获授权,可以让管道短路。
-
-
资源筛选器Resource Filter: -
授权后运行。 -
OnResourceExecuting 在筛选器管道的其余阶段之前运行代码。例如, OnResourceExecuting
在模型绑定之前运行代码。 -
OnResourceExecuted 在管道的其余阶段完成之后运行代码。
-
-
操作筛选器 Action Filter: -
在调用操作方法之前和之后立即运行。 -
可以更改传递到操作中的参数。 -
可以更改从操作返回的结果。 -
不可在 Razor Pages 中使用。
-
-
异常筛选器Exception Filter在向响应正文写入任何内容之前,对未经处理的异常应用全局策略。 -
结果筛选器 Result Filter: -
在执行操作结果之前和之后立即运行。 -
仅当操作方法成功执行时才会运行。 -
对于必须围绕视图或格式化程序的执行的逻辑,会很有用。
-

Filter实现

Filter作用域

授权Filter
-
是筛选器管道中运行的第一个筛选器。
-
控制对操作方法的访问。
-
具有在它之前的执行的方法,但没有之后执行的方法。
using Microsoft.AspNetCore.Mvc.Filters;
using System;
namespace Microsoft.AspNetCore.Mvc
{
//
// 摘要:
// An authorization filter that confirms requests are received over HTTPS.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class RequireHttpsAttribute : Attribute, IAuthorizationFilter, IFilterMetadata, IOrderedFilter
{
public RequireHttpsAttribute();
public bool Permanent { get; set; }
public int Order { get; set; }
public virtual void OnAuthorization(AuthorizationFilterContext filterContext);
protected virtual void HandleNonHttpsRequest(AuthorizationFilterContext filterContext);
}
}
资源Filter
using Microsoft.AspNetCore.Mvc.Filters;
namespace DemoCoreMVC.Filter
{
/// <summary>
/// 同步版本
/// </summary>
public class LogResourceFilter :Attribute, IResourceFilter
{
public void OnResourceExecuted(ResourceExecutedContext context)
{
//Action执行完成后执行
Console.WriteLine("********************On Resource Filter Executed********************");
}
public void OnResourceExecuting(ResourceExecutingContext context)
{
//授权Filter执行后执行。
Console.WriteLine("********************On Resource Filter Executing********************");
}
}
/// <summary>
/// 异步版本
/// </summary>
public class AsynLogResouceFilter : Attribute, IAsyncResourceFilter
{
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{
Console.WriteLine("********************On Aysnc Resource Filter Executing********************");
var exceutedContext = await next();
Console.WriteLine("********************On Async Resource Filter Executed********************");
}
}
}
操作Filter
-
实现 IActionFilter 或 IAsyncActionFilter 接口。
-
它们的执行围绕着操作方法的执行。
using Microsoft.AspNetCore.Mvc.Filters;
namespace DemoCoreMVC.Filter
{
public class DoDoActionFilter : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("********************On Action Executed********************");
}
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine("********************On Action Executing********************");
}
}
public class AsyncDoDoActionFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
Console.WriteLine("********************On Async Action Executing********************");
await next();
Console.WriteLine("********************On Async Action Executed********************");
}
}
}
-
ActionArguments - 用于读取操作方法的输入。
-
Controller - 用于处理控制器实例。
-
Result - 设置
Result
会使操作方法和后续操作筛选器的执行短路。
Controller
和 Result
以及以下属性:-
Canceled - 如果操作执行已被另一个筛选器设置短路,则为 true。
-
Exception - 如果操作或之前运行的操作筛选器引发了异常,则为非 NULL 值。将此属性设置为 null:
-
有效地处理异常。
-
执行
Result
,从操作方法中将它返回。
-
IAsyncActionFilter
,一个向 ActionExecutionDelegate 的调用可以达到以下目的:-
执行所有后续操作筛选器和操作方法。
-
返回
ActionExecutedContext
。
异常Filter
-
实现 IExceptionFilter 或 IAsyncExceptionFilter。
-
可用于实现常见的错误处理策略。
using Microsoft.AspNetCore.Mvc.Filters;
namespace DemoCoreMVC.Filter
{
public class DoExceptionFilter :Attribute, IExceptionFilter
{
public void OnException(ExceptionContext context)
{
Console.WriteLine("********************On Exception********************");
}
}
public class DoAsyncExceptionFilter : Attribute, IAsyncExceptionFilter
{
public async Task OnExceptionAsync(ExceptionContext context)
{
await Task.Run(() =>
{
Console.WriteLine("********************On Exception Async********************");
});
}
}
}
-
没有之前和之后的事件。
-
实现 OnException 或 OnExceptionAsync。
-
处理 Razor 页面或控制器创建、模型绑定、操作筛选器或操作方法中发生的未经处理的异常。
-
请不要捕获资源筛选器、结果筛选器或 MVC 结果执行中发生的异常。
true
或分配 Result 属性。这将停止传播异常。异常筛选器无法将异常转变为“成功”。只有操作筛选器才能执行该转变。-
非常适合捕获发生在操作中的异常。
-
并不像错误处理中间件那么灵活。
结果Filter
-
实现接口:
-
IResultFilter 或 IAsyncResultFilter
-
IAlwaysRunResultFilter 或 IAsyncAlwaysRunResultFilter
-
-
它们的执行围绕着操作结果的执行
结果Filter,示例如下:
using Microsoft.AspNetCore.Mvc.Filters;
namespace DemoCoreMVC.Filter
{
public class DoResultFilter :Attribute, IResultFilter
{
public void OnResultExecuted(ResultExecutedContext context)
{
Console.WriteLine("********************On Result Executed********************");
}
public void OnResultExecuting(ResultExecutingContext context)
{
Console.WriteLine("********************On Result Executing********************");
}
}
public class DoAysncResultFilter :Attribute, IAsyncResultFilter
{
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
Console.WriteLine("********************On Result Execution Async Executing********************");
await next();
Console.WriteLine("********************On Result Execution Async Executed********************");
}
}
}
Filter测试
[DoExceptionFilter]
[LogResourceFilter]
[DoResultFilter]
[DoDoActionFilter]
public IActionResult Index()
{
_logger.LogInformation("Hello, 这是首页!");
return View();
}

Filter全局应用
builder.Services.AddControllersWithViews(option =>
{
option.Filters.Add<LogResourceFilter>();
option.Filters.Add<DoExceptionFilter>();
option.Filters.Add<DoResultFilter>();
option.Filters.Add<DoDoActionFilter>();
});

参考文档
以上就是ASP.NET Core MVC 从入门到精通之Filter的全部内容。