Не должен ли набор и порядок источников привязки зависеть от HTTP-глагола? - PullRequest
0 голосов
/ 16 октября 2018

Я немного смущен.У меня есть метод действия (asp.net core 2.1) с этой подписью:

[HttpGet]
public IEnumerable<DeviceTypeDTO> Get(GetDeviceTypeRequest request)

Когда я делаю запрос, я получаю сообщение об ошибке 400 с сообщением:

Нетребуется пустое тело запроса.

Во-первых, я хотел бы понять, почему он останавливается и не пытается связать модель из строки запроса.По крайней мере, я ожидал бы такого поведения после прочтения doc .

Кстати, как только я применяю атрибут [FromQuery], все работает нормально.

Во-вторых, почемупытается ли он получить данные из тела в первую очередь для Get метода?

update

Это выглядит как после того, как источник привязкиПредполагается, что другие источники не исследованы.Причиной этого является атрибут [ApiController].Без этого связыватель модели пытается получить данные из нескольких источников.

1 Ответ

0 голосов
/ 16 октября 2018

Во-первых, я хотел бы понять, почему он останавливается и не пытается связать модель из строки запроса.

Атрибут [ApiController] добавляет настройки к Модель приложения используется в ASP.NET Core MVC.Одна из этих настроек заключается в том, как определяется источник для привязки модели.Для каждого найденного действия вызывается функция InferParameterBindingSources внутри ApiBehaviorApplicationModelProvider, которая включает следующий код:

for (var i = 0; i < actionModel.Parameters.Count; i++)
{
    var parameter = actionModel.Parameters[i];
    var bindingSource = parameter.BindingInfo?.BindingSource;
    if (bindingSource == null)
    {
        bindingSource = InferBindingSourceForParameter(parameter);

        parameter.BindingInfo = parameter.BindingInfo ?? new BindingInfo();
        parameter.BindingInfo.BindingSource = bindingSource;
    }
}

ВызовInferBindingSourceForParameter является наиболее уместным здесь, который включает следующий код:

var bindingSource = IsComplexTypeParameter(parameter) ?
    BindingSource.Body :
    BindingSource.Query;

Как видно выше, код проверяет параметр (GetDeviceTypeRequest request в вашем примере), чтобы увидетьесли это сложно (что в вашем примере).Учитывая, что он действительно сложный, параметр настроен для использования из тела запроса.

Во-вторых, почему он пытается получить данные из тела, в первую очередь, для метода Get?

Поскольку все это выполняется как часть настройки модели приложения ASP.NET Core MVC, нет контекста в полете, чтобы определить, является ли это запросом GET или POST.Сказав это, я предполагаю, что было бы достаточно просто использовать атрибут [HttpGet], который находится в самом действии, чтобы определить, что запрос будет GET-запросом, но я не могу быть уверен, что это довольно просто.Это может быть вызвано как проблема на GitHub для ASP.NET Core MVC, но это будет критическое изменение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...