想要得到405(方法不允许)而不是404

时间:2019-04-19 09:45:17

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-2.2

提供有效的路由但未找到HTTP方法时,我试图获取405错误。当前,应用程序返回404s,因为它需要路由和方法都与该功能匹配(MVC中的预期行为)。

[HttpGet("api/action")]
public IActionResult ActionGet()
{
    // code
}

[HttpPost("api/action")]
public IActionResult ActionPost()
{
    //code
}

在此示例中,如果我执行DELETEPUT请求,它将不会路由到这些函数中的任何一个,而只会返回404。

我当前的解决方案是在每个控制器中创建一个函数,无论使用哪种HTTP方法,该控制器的所有路由都经过硬编码以捕获请求。然后,这只会引发405错误。

[Route("api/action", Order = 2)]
public IActionResult Handle405()
{
    return StatusCode(405);
}

但是,我不太喜欢这种方式,因为它会在多个控制器上复制代码,并且每次在控制器中创建新动作时都需要更新硬编码的路由列表。

是否有更清洁的解决方案可以按我想要的方式处理路线?例如使用属性或过滤器?

1 个答案:

答案 0 :(得分:5)

ASP.NET Core 2.2起,MVC services默认支持您所需的行为。确保在Version_2_2方法中将MVC服务的兼容版本设置为ConfigureServices

Startup.cs

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

示例

出于演示目的,我创建了一个类似于您的API控制器。

ActionsController.cs

[Route("api/[controller]")]
[ApiController]
public class ActionsController : ControllerBase
{
    [HttpGet("action")]
    public IActionResult ActionGet()
    {
        return Ok("ActionGet");
    }

    [HttpPost("action")]
    public IActionResult ActionPost()
    {
        return Ok("ActionPost");
    }
}

获取请求

GET /api/actions/action HTTP/1.1
Host: localhost:44338
  

200 ActionGet

POST请求

POST /api/actions/action HTTP/1.1
Host: localhost:44338
  

200个ActionPost

PUT请求

PUT /api/actions/action HTTP/1.1
Host: localhost:44338
  

405方法不允许