Почему метод http get принимает запрос HTTP post в веб-интерфейсе asp.net? - PullRequest
1 голос
/ 14 апреля 2019

У меня есть 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, что делать?

1 Ответ

4 голосов
/ 14 апреля 2019

Поскольку это 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 соответствует шаблону маршрута.В обычной маршрутизации значения маршрута из соответствия используются для выбора действия и контроллера из таблицы поиска всех обычных маршрутизируемых действий.В атрибутной маршрутизации каждый шаблон уже связан с действием, и дальнейший поиск не требуется.

...