Поскольку это 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, что нужно сделать?
с атрибутом route на месте, фреймворк сделает это за вас, так что вам больше нечего делать.
Reference Маршрутизация к действиям контроллера в ASP.NET Core
Смешанная маршрутизация: маршрутизация атрибутов по сравнению с обычной маршрутизацией
Отличительной особенностью двух типов систем маршрутизации является процесс, применяемый послеURL соответствует шаблону маршрута.В обычной маршрутизации значения маршрута из соответствия используются для выбора действия и контроллера из таблицы поиска всех обычных маршрутизируемых действий.В атрибутной маршрутизации каждый шаблон уже связан с действием, и дальнейший поиск не требуется.