Разрабатывая платформу API, которая должна быть согласованной через саму службу приложений и охватывать службу управления API Azure, я обнаружил, что столкнулся с несогласованностью между ними обоими.
Отправка запроса с неправильным HTTP-глаголом (например, PUT вместо POST) в службу управления API приводит к ответу 404 Not found (из-за известной проблемы).
Отправка того же запроса непосредственно в приложение на основе ASP Core 2.2 приведет к ответу 405 Not Allowed.
Есть ли возможность в ASP Core (возможно, промежуточном программном обеспечении) поймать результат кода ответа 405 и изменить его на 404?
Не уверен, что я поклонник простого преобразования кода статуса вслепую. Конечно, на ваше усмотрение, исходя из вашего точного сценария.
Этот бит промежуточного программного обеспечения, внедренный в ваш метод Configure
, поможет:
public void Configure(IApplicationBuilder app)
{
app.Use(next => context =>
{
context.Response.OnStarting(() =>
{
if (context.Response.StatusCode == 405)
{
context.Response.StatusCode = 404;
}
return Task.CompletedTask;
});
return next(context);
});
}
ПРИМЕЧАНИЕ: Добавьте это в начале цепочки.
Это то, с чем вы можете справиться с помощью промежуточного программного обеспечения StatusCodePages
. Вот пример:
app.UseStatusCodePages(ctx =>
{
if (ctx.HttpContext.Response.StatusCode == 405)
ctx.HttpContext.Response.StatusCode = 404;
return Task.CompletedTask;
});
Аргумент, переданный в UseStatusCodePages
, представляет собой функцию обратного вызова, которая выполняется всякий раз, когда промежуточное ПО обнаруживает ответ с кодом состояния от 400 до 599 (с пустым телом). В приведенном выше примере мы просто проверяем наличие 405
и меняем его на 404
. Сам вызов UseStatusCodePages
должен быть размещен перед любым промежуточным программным обеспечением для обработки запросов, таким как MVC.
Я имел в виду сценарий, когда Службы управления версиями API добавляется в коллекцию сервисов, а вызывающий контроллер оборачивается ApiVersionAttribute. По этой причине возвращается код состояния 405, а полезная нагрузка ответа (по умолчанию) содержит следующий JSON: { "error": { "code": "UnsupportedApiVersion", "message": "..." } }
. Напротив, готовый проект веб-приложения ASP.NET Core просто возвращал бы код состояния 404 и пустые полезные данные ответа.
Хорошо, в этом есть смысл. Если тело не пусто, промежуточное ПО страниц кода состояния не запустится. Спасибо за обновления.
Спасибо, _italic_UseStatusCodePages был первым, что я попробовал, но если используется управление версиями API (которое выдает статус 405) - в описанном сценарии его делегат-обработчик никогда не выполняется.