POST方法始终返回405响应

时间:2020-02-19 17:23:33

标签: c# asp.net-core asp.net-core-webapi

我有一个.NET Core 3.1 API,该API具有两个端点,用于测试我编写的一些错误处理中间件。我正在使用Swagger UI来测试此API。

我遇到的问题是,如果在执行POST请求期间抛出任何异常,它将作为405响应返回,甚至不会触发我正在编写的错误处理中间件。对于我的API中的所有POST请求,都会发生这种情况,而不仅仅是我正在显示的测试。

我决定尝试同样简单的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呢?

编辑:这是我正在执行的示例POST请求

请求网址:https://localhost:44387/api/Testing/TestPost

请求正文(JSON):“测试”

这是我从POST收到的响应标头:

允许:GET 缓存控制:无缓存 日期:2020年2月19日星期三17:58:22 GMT 到期:-1 语用:无缓存 服务器:Microsoft-IIS / 10.0 状态:405 x-技术支持:ASP.NET

1 个答案:

答案 0 :(得分:3)

所以我最终在Rahul Sharma的帮助下解决了这个问题 。该问题与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个响应。

我很抱歉最初没有添加此代码,但是我非常有信心该代码不是问题的原因,因为错误控制器中的代码根本没有执行。