我想对所有 asp.net core 最小 API 端点应用过滤器。
我想这样做的原因是为了对端点的返回值进行后处理。像这样的东西:
public class GlobalFilter : IEndpointFilter
{
private ILogger _logger;
public GlobalValidationFilter(ILogger<GlobalValidationFilter> logger)
{
_logger = logger;
}
public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext invocationContext, EndpointFilterDelegate next)
{
try
{
var res = await next(invocationContext);
var result = res as Result;
if(result is not null)
{
// Here, access the `result` members and modify the return value accordingly...
}
return Results.Problem();
}
catch (Exception ex)
{
return Results.Problem(ex.ToString());
}
}
}
app
.MapPost("api/document/getById", async ([FromBody] GetDocumentRequest request) =>
{
var result = ...result-producing call...;
return result;
})
.AddEndpointFilter<GlobalFilter>() // Manually assigning the filter.
...
...;
这似乎有效,但我必须记住每次都手动设置过滤器。 有没有办法自动将此过滤器应用于所有端点?
或者,是否可以用另一种方法达到同样的效果?据我所知,使用中间件不允许您检查端点返回值,而只能处理抛出的异常。
您可以将过滤器应用于MapGroup,
MapGroup
可以指向所有最小端点。
示例:
public static class GroupEndPointsExt
{
public static RouteGroupBuilder MapMinimalApi(this RouteGroupBuilder group)
{
group.MapPost("document/getById", async ([FromBody] GetDocumentRequest request) =>
{
var result = ...result-producing call...;
return result;
})
.AddEndpointFilter<GlobalFilter>() // Manually assigning the filter.
...
...;
return group;
}
}
然后在你的
Program.cs
app.MapGroup("api").MapMinimalApi().AddEndpointFilter<GlobalFilter>();