ASP.NET Core. Можно ли применить фильтр для всех минимальных конечных точек API?

Я хочу применить фильтр ко всем минимальным конечным точкам API asp.net.

Причина, по которой я хочу это сделать, заключается в постобработке возвращаемых значений конечной точки. Что-то вроде этого:

    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.
                ...
                ...;

Кажется, это работает, но мне придется каждый раз не забывать устанавливать фильтр вручную. Есть ли способ автоматически применить этот фильтр ко всем конечным точкам?

Альтернативно, можно ли добиться того же самого другим методом? Судя по тому, что я видел, использование промежуточного программного обеспечения не позволяет вам проверять возвращаемые значения конечной точки, а только обрабатывать возникающие исключения.

Может быть, промежуточное ПО — лучший вариант для вас? Если нет, в этой статье есть предложения о том, как можно применять глобальные фильтры.

Peppermintology 19.04.2024 12:12

@Peppermintology Судя по тому, что я видел, промежуточное программное обеспечение не позволяет проверять возвращаемые значения конечной точки. Хотя ссылка кажется интересной.

user2173353 19.04.2024 12:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
348
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете применить фильтр к 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;
       });
//add other minimal endpoints here where global filter will apply
        return group;
    }
}

Затем в вашем Program.cs примените GlobalFilter к группе маршрутов, которая охватывает все ваши минимальные конечные точки, определенные в методе MapMinimalApi.

app.MapGroup("api").MapMinimalApi().AddEndpointFilter<GlobalFilter>();
//Global filter will apply to all endpoints in this route group
//all endpoints in this route group will use path prefixed with api

Это может очень помочь, хотя может перенести проблему на уровень группы, а не на уровень конечной точки. Сейчас я вообще не использую группы, поэтому для моего случая это может быть подходящим решением.

user2173353 19.04.2024 12:36

@user2173353 Группы маршрутов — это всего лишь способ организовать группы конечных точек с общим префиксом, а также поможет вам обеспечить DRY.

Denis Michealk 19.04.2024 12:43

Другие вопросы по теме