我有一个.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
答案 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个响应。
我很抱歉最初没有添加此代码,但是我非常有信心该代码不是问题的原因,因为错误控制器中的代码根本没有执行。