在ASP.NET Core中,Filter(过滤器)是一种强大的机制,允许你在请求处理管道中的特定阶段运行代码。这些过滤器提供了在请求的不同阶段执行逻辑的能力,比如授权、日志记录、异常处理等。ASP.NET Core 提供了多种类型的过滤器,每种类型都在请求处理管道的不同阶段运行。
以下是ASP.NET Core中主要的过滤器类型:
- 授权过滤器(Authorization Filters)
- 在其他过滤器之前执行。
- 用于确定用户是否被授权访问请求的资源。
- 实现
IAuthorizationFilter
接口。
csharp
public class MyAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
// 检查用户是否授权
// 如果未授权,可以设置 context.Result 来停止请求处理
}
}
// 应用到控制器或动作方法
[ServiceFilter(typeof(MyAuthorizationFilter))]
public class MyController : ControllerBase
{
// ...
}
- 资源过滤器(Resource Filters)
- 在模型绑定之后和动作过滤器之前执行。
- 用于处理需要在模型绑定后但动作执行前运行的代码(如缓存)。
- 实现
IResourceFilter
接口。 - 也可以实现
IAsyncResourceFilter
接口以支持异步操作。
csharp
public class MyResourceFilter : IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
// 在模型绑定之后,动作执行之前运行
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
// 在动作执行之后,结果执行之前运行
}
}
// 应用到控制器或动作方法
[ServiceFilter(typeof(MyResourceFilter))]
public class MyController : ControllerBase
{
// ...
}
- 动作过滤器(Action Filters)
- 在模型绑定和授权之后,但在视图结果执行之前运行。
- 用于查看或修改传入的动作参数、调用的动作本身或动作结果。
- 实现
IActionFilter
接口。 - 也可以实现
IAsyncActionFilter
接口以支持异步操作。
csharp
public class MyActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// 在动作执行之前运行
}
public void OnActionExecuted(ActionExecutedContext context)
{
// 在动作执行之后,结果执行之前运行
}
}
// 或者使用特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : Attribute, IActionFilter
{
// ... 实现与上面相同
}
// 应用到控制器或动作方法
[MyActionFilter]
public class MyController : ControllerBase
{
// ...
}
- 异常过滤器(Exception Filters)
- 当动作执行后发生未处理的异常时运行。
- 用于处理未处理的异常,并提供一个替代的HTTP响应。
- 实现
IExceptionFilter
接口。
csharp
public class MyExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
// 处理异常
// 可以设置 context.Result 来提供替代的HTTP响应
}
}
// 应用到控制器或动作方法
[ServiceFilter(typeof(MyExceptionFilter))]
public class MyController : ControllerBase
{
// ...
}
- 结果过滤器(Result Filters)
- 在动作结果执行之后运行。
- 用于查看或修改由动作方法返回的
IActionResult
。 - 实现
IResultFilter
接口。 - 也可以实现
IAsyncResultFilter
接口以支持异步操作。
csharp
public class MyResultFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
// 在结果执行之前运行
}
public void OnResultExecuted(ResultExecutedContext context)
{
// 在结果执行之后运行
}
}
// 应用到控制器或动作方法
[ServiceFilter(typeof(MyResultFilter))]
public class MyController : ControllerBase
{
// ...
}
-
全局异常处理器(Global Exception Handler)
- 这并不是一个过滤器,但它是ASP.NET Core中处理全局异常的一种机制。
- 通过配置
UseExceptionHandler
中间件来处理全局未处理的异常。
-
中间件(Middleware)
- 虽然不是过滤器,但中间件是ASP.NET Core中处理请求和响应的另一种机制。
- 中间件在请求处理管道中运行,并可以决定是否将请求传递给管道中的下一个组件,或者是否直接发送响应给客户端。
csharp
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)
{
try
{
await _next(httpContext);
}
catch (Exception ex)
{
// 处理异常并返回适当的响应
await HandleExceptionAsync(httpContext, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
// 写入响应体或其他错误处理逻辑
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Internal Server Error");
}
}
// 在Startup.cs中配置中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseMiddleware<ErrorHandlingMiddleware>();
// ...
}
使用过滤器时,你可以通过特性(Attribute)将其直接应用于控制器或动作方法,或者通过全局配置将其应用于整个应用程序。这些过滤器提供了一种灵活且模块化的方式来扩展ASP.NET Core应用程序的功能。
请注意,对于使用ServiceFilter
的过滤器,你需要在Startup.cs
中的ConfigureServices
方法中注册它们作为服务。例如:
csharp
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddScoped<MyAuthorizationFilter>();
services.AddScoped<MyResourceFilter>();
services.AddScoped<MyExceptionFilter>();
// ...
}
而使用特性(Attribute)的过滤器则不需要在ConfigureServices
中注册