Запрос Entity Coming As Null при обновлении до 3.1 c# - PullRequest
2 голосов
/ 27 мая 2020

ИЗМЕНИТЬ

Я здесь новенький. Так что, если это повторяющийся вопрос, пожалуйста, простите меня.

У нас возникла проблема, когда мы перешли на tnet core 3.1 с версии 2.0. Объясняется следующим образом:

Сначала наша сущность такая

class Student {
      string StudentId 
}

Итак, когда мы использовали наш контроллер вот так

 public async Task<IActionResult> GetStudentByIdAsync([FromBody] Student studentrequest)

, мы никогда не получали Studentrequest как null в 2.0 , если мы отправили объект как {"studentId":1} или {"studentId":"1"}

, оба работали нормально.

Но в 3.1 мы получаем запрос как null , если мы передаем запрос как {"studentId":1}. Наш пользовательский интерфейс основан на этом формате и является отдельной внешней командой. И над этим у нас много работы. Так что ни они, ни мы не хотим меняться.

Еще один момент: раньше мы использовали addMvc() в Startup.cs, но теперь мы используем addControllers(). Может ли это быть причиной этого?

Кто нибудь может помочь? Заранее спасибо.

1 Ответ

2 голосов
/ 28 мая 2020

Спасибо за комментарий Дая:

Какую JSON библиотеку десериализации вы используете? ASP. NET Core 3+ использует новую библиотеку Microsoft JSON вместо Newtonsoft. Json - Я подозреваю, что он отказывается сопоставить свойство camelCase studentId JSON с вашим членом класса PascalCase StudentId. - Dai

Я смог понять, что это было изменение в реализации от NewtonSoft. Json как средство форматирования в do tnet Core 2.0 на System.Text. Json в 3.X.

Осмотрев решение, я нашел этот пост на носителе.

Решением для предотвращения моей ошибки было добавление Microsoft.AspNetCore. Mvc .Newtonsoft Json nuget в свое решение и интегрировать следующие или аналогичные строки в свой метод настройки startup.cs:

        _ = services.AddControllers(options =>
          {
              options.Filters.Add(typeof(WithHeaderHandlerAttribute));
          })
           .AddNewtonsoftJson(
            options =>
            options.SerializerSettings.ContractResolver = new
            CamelCasePropertyNamesContractResolver()).AddJsonOptions(options => options.JsonSerializerOptions.PropertyNameCaseInsensitive = true);

Надеюсь, это поможет кому-то другому.

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