FormDataCollection не работает в ASP.NET Core 2.1?

Не проверяйте это с Core 1.1 или 2.0. Ситуация возникает при использовании FormDataCollection в качестве параметра в методе контроллера следующим образом:

[Route("[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
    [Route("user")]
    [HttpPost]
    public HttpResponseMessage CheckUser(FormDataCollection form)
    {
     ...
    }
}

Он возвращает 400 неверный запрос независимо от заголовка Content-Type.

Но это работает в .NET Framework 4.5:

[RoutePrefix("auth")]
public class AuthController : ApiController
{
    [Route("user")]
    [HttpPost]
    public HttpResponseMessage user(FormDataCollection form)
    {
        ...
    }
}

Конечно, я могу использовать Request.Form.TryGetValue(key, out var value). Но класс FormDataCollection не ограничен в Core, и мне любопытно, можем (и должны) мы использовать его для получения параметров публикации?


person xneg    schedule 12.07.2018    source источник
comment
Это когда-нибудь работало? Действия принимают либо DTO, либо явные параметры. Использование ведра, такого как FormDataCollection`, побеждает саму цель привязки данных MVC   -  person Panagiotis Kanavos    schedule 12.07.2018
comment
Почему вы вообще использовали FormDataCollection? Если бы вы использовали DTO, он был бы создан из тела. Если вы хотите привязать простые параметры к телу, используйте [FromBody]   -  person Panagiotis Kanavos    schedule 12.07.2018
comment
@PanagiotisKanavos только что нашел его в одном репозитории, предназначенном для фреймворка 4.5, и захотел преобразовать его в NET Core. И на самом деле это не MVC, а его API. И формально он не знает модели DTO.   -  person xneg    schedule 12.07.2018
comment
И не стоит пробовать случайный код. Вы не найдете этот класс в документации, учебниках или курсах. Изучите руководства на сайте документации ASP.NET, чтобы понять, как на самом деле Web API работает   -  person Panagiotis Kanavos    schedule 12.07.2018


Ответы (1)


FormDataCollection, поставляемый с Microsoft.AspNetCore.Mvc.WebApiCompatShim , не имеет конструктора без параметров, поэтому это может быть причиной проблемы. Согласно официальной документации -

Чтобы привязка произошла, класс должен иметь общедоступный конструктор по умолчанию, а член, который должен быть привязан, должен иметь общедоступные свойства с возможностью записи. Когда происходит привязка модели, экземпляр класса будет создан только с использованием общедоступного конструктора по умолчанию, после чего можно установить свойства.

person Kiryl Z    schedule 12.07.2018
comment
Я просмотрел FormDataCollection в Microsoft.AspNet.WebApi.Client. Но вы правы, у него нет конструктора без параметров. Так каков его вариант использования? - person xneg; 12.07.2018
comment
Извините, что вы подразумеваете под вариантом использования? в ядре asp.net? - person Kiryl Z; 12.07.2018
comment
Да, в ядре asp.net. - person xneg; 12.07.2018
comment
@xneg Согласно официальному документу о привязке в ядре asp.net - для того, чтобы привязка произошла, класс должен иметь общедоступный конструктор по умолчанию, а член, который должен быть привязан, должен быть общедоступными записываемыми свойствами. Когда происходит привязка модели, экземпляр класса будет создан только с использованием общедоступного конструктора по умолчанию, после чего можно установить свойства. Мне кажется, что это что-то было портировано для обратной совместимости, например, если у вас много кода, использующего FormDataCollection. - person Kiryl Z; 13.07.2018
comment
ах спасибо. Обратная совместимость кажется разумной. Приму ваш ответ. - person xneg; 13.07.2018
comment
@xneg я рад, что смог помочь - person Kiryl Z; 13.07.2018