首页 > 解决方案 > ASP .NET Core 3.1 登录构造函数返回 NULL。登录属性未绑定到 JsonApiDotNetCore 的 Post 请求

问题描述

我目前正在将 ASP .NET Core Web API 从 2.2 升级到 3.1。我正在通过 PostMan 测试控制器以确保一切正常。它不是。当我第一次尝试登录时,我通过 Postman 在 HttpPost 请求中向 Web API 发送了一个有效的用户名和密码。但是,当它调用登录构造函数时,它返回NULL,这意味着模型不包含我刚刚传递的用户名和密码。有谁知道为什么会这样?

注意 1:我确信我通过 PostMan 提交的 Post 请求是正确的,因为我可以成功地将相同的请求提交到 .NET Core 2.2 Web API。

注意 2:WebApi 运行 .NET Core 3.1 和JsonApiDotNetCore4.0.0-alpha4,而模型包含在一个单独的 .NET Standard 2.1 项目中JsonApiDotNetCore(我无法升级到 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: "test@test.com",
    password: "12345",
    rememberme: "false"
}

邮差设置:

Body = Raw

标题(键/值):

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

标签: asp.netasp.net-corejson-apiasp.net-core-3.1

解决方案


  1. 从 3.0 开始,ASP.NET Core 使用System.Text.Json默认的 JSON 序列化器/反序列化器,这需要严格的 JSON 语法。此行为不同于旧的 Newtonsoft.JSON。

  2. 实际上,即使是 Newtonsoft.JSON 支持的有效载荷,它也不是有效的JSON

    {
        username: "test@test.com",
        password: "12345",
        rememberme: "false"
    }
    

    (JSON 属性应该是一个以 开头的字符串",请参阅JSON.org

    目的

    细绳

  3. 如果您想像过去那样使用 JSON,请遵循以下文档


推荐阅读