为什么http get方法在asp.net web api中接受http post请求?

问题描述 投票:1回答:1

我有一个HTTP-GET方法看起来像下面一个

[Route("api/[controller]")]
[ApiController]
public class CityController : ControllerBase
{
    public ActionResult Get(int id)
    {
        try
        {
            var city = new { CityName = "Gotham" };
            return Ok(city);
        }
        catch(Exception ex)
        {
            return StatusCode(500);
        }
    }
}

对于这两种类型的请求

请求:

GET http://localhost:49915/api/city
POST http://localhost:49915/api/city

响应:

status: 200 OK
-------------------
{
    "cityName": "Gotham"
}

现在我的问题是,

  1. 因为它是GET,它应该接受POST吗?
  2. 它不应该返回405状态代码,为什么不返回? (至少我期待)
  3. 在这种情况下,如果我必须返回405要做什么?
c# asp.net-core asp.net-core-webapi asp.net-core-routing
1个回答
4
投票

因为这是一个GET,它应该接受POST吗?

虽然你认为它是一个get,因为动作名称和基于约定的路由,你会被误认为控制器已经为属性路由进行了装饰。

[Route("api/[controller]")]

因此,如果匹配,则忽略基于约定的路线。请注意PUTDELETE

PUT http://localhost:49915/api/city
DELETE http://localhost:49915/api/city

也应该采取相同的行动。

它不应该返回405状态代码,为什么不返回? (至少我期待)

该操作按设计匹配两个调用,因为没有为该操作指定。

[Route("api/[controller]")]
[ApiController]
public class CityController : ControllerBase {
    // GET api/city?id=2 //Note id would be optional as a query variable.
    [HttpGet]
    public ActionResult Get(int id) {
        try {
            var city = new { CityName = "Gotham" };
            return Ok(city);
        } catch(Exception ex) {
            return StatusCode(500);
        }
    }
}

现在有了HttpGet,如果

POST http://localhost:49915/api/city

或者其他HTTP方法完成后,您将收到405错误,因为路径匹配,但方法不匹配。

在这种情况下,如果我必须返回405要做什么?

如果属性路由到位,框架将为您执行此操作,因此您无需执行任何操作。

参考Routing to controller actions in ASP.NET Core

混合路由:属性路由与传统路由

两种类型的路由系统的区别在于URL与路由模板匹配后应用的过程。在传统路由中,来自匹配的路由值用于从所有传统路由动作的查找表中选择动作和控制器。在属性路由中,每个模板已与操作关联,无需进一步查找。

© www.soinside.com 2019 - 2024. All rights reserved.