ASP.NET Core - 是否可以为所有最小 API 端点应用过滤器?

问题描述 投票:0回答:1

我想对所有 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.
                ...
                ...;

这似乎有效,但我必须记住每次都手动设置过滤器。 有没有办法自动将此过滤器应用于所有端点?

或者,是否可以用另一种方法达到同样的效果?据我所知,使用中间件不允许您检查端点返回值,而只能处理抛出的异常。

c# .net asp.net-core minimal-apis
1个回答
0
投票

您可以将过滤器应用于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>();
© www.soinside.com 2019 - 2024. All rights reserved.