【问题标题】:Want to get 405 (Method Not Allowed) instead of 404想要得到 405(不允许的方法)而不是 404
【发布时间】:2019-09-09 14:33:32
【问题描述】:

当提供有效路由但未找到 HTTP 方法时,我试图得到 405 错误。目前,应用程序返回 404,因为它需要路由和方法都匹配函数(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);
}

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

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

【问题讨论】:

  • 试试 ProducesResponseType 属性

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


【解决方案1】:

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

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 请求

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

200 次行动获取

POST 请求

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

200 个动作帖子

PUT 请求

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

405 方法不允许

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2021-12-20
    • 2023-03-23
    • 2011-04-05
    • 2014-05-23
    相关资源
    最近更新 更多