我有一个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"
}
现在我的问题是,
GET
,它应该接受POST
吗?因为这是一个GET,它应该接受POST吗?
虽然你认为它是一个get,因为动作名称和基于约定的路由,你会被误认为控制器已经为属性路由进行了装饰。
[Route("api/[controller]")]
因此,如果匹配,则忽略基于约定的路线。请注意PUT
和DELETE
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与路由模板匹配后应用的过程。在传统路由中,来自匹配的路由值用于从所有传统路由动作的查找表中选择动作和控制器。在属性路由中,每个模板已与操作关联,无需进一步查找。