Я хочу применить фильтр ко всем минимальным конечным точкам 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 Судя по тому, что я видел, промежуточное программное обеспечение не позволяет проверять возвращаемые значения конечной точки. Хотя ссылка кажется интересной.





Вы можете применить фильтр к 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 Группы маршрутов — это всего лишь способ организовать группы конечных точек с общим префиксом, а также поможет вам обеспечить DRY.
Может быть, промежуточное ПО — лучший вариант для вас? Если нет, в этой статье есть предложения о том, как можно применять глобальные фильтры.