Метод POST всегда возвращает ответ 405 - PullRequest
1 голос
/ 19 февраля 2020

У меня есть. NET Core 3.1 API, который имеет две конечные точки, которые я использую для тестирования некоторого промежуточного программного обеспечения для обработки ошибок, которое я пишу. Я использую Swagger UI для тестирования этого API.

Проблема, с которой я столкнулся, заключается в том, что если во время выполнения моего запроса POST возникнет какое-либо исключение, оно будет возвращено обратно как ответ 405 и даже не вызовет промежуточное ПО обработки ошибок, которое я пишу. Это происходит для запроса ALL POST через мой API, а не только для тестового, который я показываю.

Я решил попробовать такой же простой метод GET и, к моему удивлению, когда в него было сгенерировано исключение, он вызвал бы мое промежуточное программное обеспечение для обработки ошибок, которое затем записывает ответ 500 к вызывающей стороне. Вот весь код контроллера:

[Route("api/[controller]")]
[ApiController]

public class TestingController : ControllerBase
{
    [HttpPost]
    [Route("TestPost")]
    public IActionResult TestPost([FromBody] string test)
    {
        throw new Exception();            
    }

    [HttpGet]
    [Route("TestGet/{test}")]
    public IActionResult TestGet(string test)
    {
        throw new Exception();
    }

}

Так почему бы метод POST возвращать 405 resposne при возникновении исключения, но метод GET отвечает 500 ответом?

EDIT: Вот пример запроса POST, который я делаю

URL запроса: https://localhost: 44387 / api / Testing / TestPost

Тело запроса (JSON): " test "

Вот заголовки ответа, которые я получаю от POST:

allow: GET cache-control: no-cache дата: ср., 19 февраля 2020 17:58:22 GMT истекает: -1 прагма: без кэширования сервер: Microsoft-IIS / 10.0 статус: 405 x-powered-by: ASP. NET

1 Ответ

1 голос
/ 19 февраля 2020

Итак, в конце концов я понял это с помощью Рахул Шарма . Проблема не имела ничего общего с методом POST, а с пользовательским контроллером обработки ошибок, на который пытался перенаправиться запрос POST. Метод в контроллере ошибок был определен следующим образом:

    [Route("/Error-descriptive")]
    [HttpGet]
    public IActionResult ErrorDescriptive()
    {
        if (!_env.IsNonProductionEnv())            
            throw new InvalidOperationException("This endpoint cannot be invoked in a production environment.");

        IExceptionHandlerFeature exFeature = HttpContext.Features.Get<IExceptionHandlerFeature>();
        Exception ex = exFeature.Error;

        return Problem(detail: ex.StackTrace, title: ex.Message);
    }

Проблема заключалась в атрибуте [HttpGet], используемом в этом методе, который препятствовал перенаправлению моего запроса POST на этот контроллер при возникновении исключения , который в свою очередь произвел ответ 405. Удаление атрибута позволяет запустить код обработчика ошибок и создать ответ 500.

Я прошу прощения за то, что изначально не добавлял этот код, однако я был довольно уверен, что этот код не был причиной проблемы, потому что код в контроллере ошибок не выполнялся вообще.

...