Недопустимый метод дескриптора ASP.NET Core 405

Разрабатывая платформу API, которая должна быть согласованной через саму службу приложений и охватывать службу управления API Azure, я обнаружил, что столкнулся с несогласованностью между ними обоими.

Отправка запроса с неправильным HTTP-глаголом (например, PUT вместо POST) в службу управления API приводит к ответу 404 Not found (из-за известной проблемы).

Отправка того же запроса непосредственно в приложение на основе ASP Core 2.2 приведет к ответу 405 Not Allowed.

Есть ли возможность в ASP Core (возможно, промежуточном программном обеспечении) поймать результат кода ответа 405 и изменить его на 404?

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

Ответы 2

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

Не уверен, что я поклонник простого преобразования кода статуса вслепую. Конечно, на ваше усмотрение, исходя из вашего точного сценария.

Этот бит промежуточного программного обеспечения, внедренный в ваш метод 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.

Спасибо, _italic_UseStatusCodePages был первым, что я попробовал, но если используется управление версиями API (которое выдает статус 405) - в описанном сценарии его делегат-обработчик никогда не выполняется.

eks77ern 18.12.2018 14:37

Я имел в виду сценарий, когда Службы управления версиями API добавляется в коллекцию сервисов, а вызывающий контроллер оборачивается ApiVersionAttribute. По этой причине возвращается код состояния 405, а полезная нагрузка ответа (по умолчанию) содержит следующий JSON: { "error": { "code": "UnsupportedApiVersion", "message": "..." } }. Напротив, готовый проект веб-приложения ASP.NET Core просто возвращал бы код состояния 404 и пустые полезные данные ответа.

eks77ern 18.12.2018 15:07

Хорошо, в этом есть смысл. Если тело не пусто, промежуточное ПО страниц кода состояния не запустится. Спасибо за обновления.

Kirk Larkin 18.12.2018 15:14

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