Конструктор входа в систему ASP .NET Core 3.1 возвращает NULL. Свойства входа в систему не связаны с запросом на публикацию JsonApiDotNetCore.

В настоящее время я обновляю веб-API ASP .NET Core с 2.2 до 3.1. Я тестирую контроллеры через PostMan, чтобы убедиться, что все в порядке. Нет. Когда я впервые пытаюсь войти в систему, я отправляю действительное имя пользователя и пароль в запросе HttpPost через Postman в веб-API. Однако, когда он вызывает конструктор входа в систему, он возвращает NULL, что означает, что модель не содержит имени пользователя и пароля, которые я только что передал. Кто-нибудь знает, почему это происходит?

Примечание 1. Я уверен, что отправленный через PostMan запрос на публикацию верен, поскольку я могу успешно отправить тот же запрос в веб-API .NET Core 2.2.

Примечание 2: WebApi работает под управлением .NET Core 3.1 с JsonApiDotNetCore 4.0.0-alpha4, тогда как модель содержится в отдельном проекте .NET Standard 2.1 с JsonApiDotNetCore 3.1 (я не могу выполнить обновление до 4.0.0-alpha4, потому что он не поддерживает. NET Standard 2.1). Может ли это быть причиной?

Контроллер входа

using Test_Model.Users;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;

namespace Test_WebApi.Controllers.Tokens
{
    public class TokensController : ControllerBase
    {
        public TokensController(
            IConfiguration objConfig,
            ILogger<TokensController> objLogger,
            IServiceProvider objServiceProvider)
            : base(objConfig, objLogger, objServiceProvider)
        { }

        [AllowAnonymous]
        [HttpPost("/clients/login")]
        public async Task<IActionResult> LoginAsync([FromBody] Login objLogin)
        {
            return new JsonResult(objLogin);
        }
    }
}

Модель входа

using JsonApiDotNetCore.Models;
using System.ComponentModel.DataAnnotations;

public class Login
{
    // Constructor
    public Login() { } // When I place a breakpoint here, the debugger returns a NULL model in 3.1 but returns the model with the correct values from PostMan.

    // Properties
    [Required]
    [EmailAddress]
    [Attr("username")]
    public string UserName { get; set; }

    [Required]
    [Attr("password")]
    public string Password { get; set; }

    [Required]
    [Attr("rememberme")]
    public bool RememberMe { get; set; }
}

jsonapidotnet не заполняет свойства.

Обновить

Почтальон запрос на отправку:

{
    username: "[email protected]",
    password: "12345",
    rememberme: "false"
}

Настройки сообщения почтальона:

Body = Raw

Заголовки (ключ / значение):

Accept / application/json
Content-Type / application/json

person J Weezy    schedule 22.02.2020    source источник
comment
Не могли бы вы показать запрос, отправленный PostMan?   -  person itminus    schedule 24.02.2020
comment
@itminus Размещено обновление.   -  person J Weezy    schedule 24.02.2020
comment
Я создал модель Lib (ориентированную на .NET Standard с использованием JsonApiDotNetCore 3.1), а также еще один веб-проект, который использует JsonApiDotNetCore 4.0.0-alpha4. Однако ваша полезная нагрузка мне подходит. Есть ли демонстрация, воспроизводящая ту же проблему?   -  person itminus    schedule 25.02.2020
comment
@itminus Не удобно - это большой проект. Не могли бы вы опубликовать созданную вами модель, чтобы я мог на нее взглянуть? Я полагаю, ваш меньше.   -  person J Weezy    schedule 25.02.2020
comment
Конечно, посмотрите этот образец   -  person itminus    schedule 25.02.2020
comment
@itminus Хорошо, я вырезал соответствующий код для контроллера и вставил его. Есть различия: вы добавили Person в модель и изменили контролируемое значение на JsonApiController<Person> вместо ControllerBase.   -  person J Weezy    schedule 25.02.2020
comment
Позвольте нам продолжить это обсуждение в чате.   -  person J Weezy    schedule 25.02.2020
comment
@itminus Похоже, вы обнаружили проблему в том, что .NET Core 3.1 больше не поддерживает ранее допустимое форматирование JSON, которое позволяло .NET Core 2.2. Если вы опубликуете ответ, я приму.   -  person J Weezy    schedule 26.02.2020


Ответы (1)


  1. Начиная с версии 3.0, ASP.NET Core использует System.Text.Json в качестве сериализатора / десериализатора JSON по умолчанию, что требует строгого синтаксиса JSON. Это поведение отличается от старого Newtonsoft.JSON.

  2. На самом деле, даже полезная нагрузка поддерживается Newtonsoft.JSON, это недопустимый JSON:

    {
        username: "[email protected]",
        password: "12345",
        rememberme: "false"
    }
    

    (Свойство JSON должно быть строкой, начинающейся с ", см. JSON.org:

    объект

    строка

  3. Если вы хотите использовать JSON так, как мы это делали в старые времена, следуйте этому документы:

person itminus    schedule 26.02.2020
comment
Спасибо за объяснение. Я перейду с NewtonSoftJson на System.Text.Json - person J Weezy; 26.02.2020
comment
это ответ очень полезен .. я ищу дни. Это действительно помогает, я также столкнулся с той же проблемой при обновлении с 2.1 до 3.1. - person Han Heong Ho; 15.02.2021