C# POST方法始终返回405响应
我有一个.NETCore3.1API,它有两个端点,用于测试我正在编写的一些错误处理中间件。我正在使用Swagger UI来测试这个API 我遇到的问题是,如果在执行POST请求期间抛出任何类型的异常,它将作为405响应返回,甚至不会触发我正在编写的错误处理中间件。这适用于我的API中的所有POST请求,而不仅仅是我正在展示的测试请求 我决定尝试一个同样简单的GET方法,令我惊讶的是,当其中抛出异常时,它将触发我的错误处理中间件,然后该中间件将向调用者回写500个响应。以下是整个控制器代码:C# POST方法始终返回405响应,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,我有一个.NETCore3.1API,它有两个端点,用于测试我正在编写的一些错误处理中间件。我正在使用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响应,而GET方法返回500响应呢
编辑:下面是我提出的示例帖子请求
请求URL:
请求正文(JSON):“测试”
以下是我从帖子中收到的回复标题:
允许:获取
缓存控制:没有缓存
日期:2020年2月19日星期三17:58:22 GMT
过期:-1
pragma:没有缓存
服务器:Microsoft IIS/10.0
现状:405
x-powered-by:ASP.NET所以我最终在来自 . 问题与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]
公共IActionResult ErrorDescriptive()
{
如果(!_env.IsNonProductionEnv())
抛出新的InvalidOperationException(“无法在生产环境中调用此端点”);
IEExceptionHandlerFeatureExFeature=HttpContext.Features.Get();
异常ex=exFeature.Error;
退货问题(详细信息:ex.StackTrace,标题:ex.Message);
}
问题在于此方法上使用的[HttpGet]属性,这会阻止在发生异常时将我的POST请求路由到此控制器,从而产生405响应。删除该属性将允许运行错误处理程序代码,并生成500响应
我很抱歉最初没有添加这段代码,但是我非常确信这段代码不是问题的原因,因为错误控制器中的代码根本没有被执行 所以我最终在他的帮助下解决了这个问题 . 问题与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]
公共IActionResult ErrorDescriptive()
{
如果(!_env.IsNonProductionEnv())
抛出新的InvalidOperationException(“无法在生产环境中调用此端点”);
IEExceptionHandlerFeatureExFeature=HttpContext.Features.Get();
异常ex=exFeature.Error;
退货问题(详细信息:ex.StackTrace,标题:ex.Message);
}
问题在于此方法上使用的[HttpGet]属性,这会阻止在发生异常时将我的POST请求路由到此控制器,从而产生405响应。删除该属性将允许运行错误处理程序代码,并生成500响应
我很抱歉最初没有添加这段代码,但是我非常确信这段代码不是问题的原因,因为错误控制器中的代码根本没有被执行 显示您如何请求
POST
@DanielA.White我正在使用Swagger UI测试API,但是我可以在我的描述中添加对API的手动调用关于您的场景,您需要在TestPost
方法中添加[AcceptVerbs(“GET”,“POST”)]
,请提供@RahulSharma[HttpPost]
属性应该如何处理您如何请求POST
@DanielA.White我正在使用Swagger UI测试API,但我可以在我的描述中向API添加手动调用关于您的场景,您需要在TestPost
方法中添加[AcceptVerbs(“GET”,“POST”)]
,请提供@RahulSharma[HttpPost]
属性应该可以做到这一点