Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# POST方法始终返回405响应_C#_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

C# POST方法始终返回405响应

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个响应。以下是整个控制器代码: [

我有一个.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]
属性应该可以做到这一点