asp.net - 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 和JsonApiDotNetCore
4.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
解决方案
从 3.0 开始,ASP.NET Core 使用
System.Text.Json
默认的 JSON 序列化器/反序列化器,这需要严格的 JSON 语法。此行为不同于旧的 Newtonsoft.JSON。实际上,即使是 Newtonsoft.JSON 支持的有效载荷,它也不是有效的
JSON
:{ username: "test@test.com", password: "12345", rememberme: "false" }
(JSON 属性应该是一个以 开头的字符串
"
,请参阅JSON.org:如果您想像过去那样使用 JSON,请遵循以下文档:
- 添加对Microsoft.AspNetCore.Mvc.NewtonsoftJson的包引用
- 通过添加 newtonsoft json 选项
services.AddControllers().AddNewtonsoftJson(...);
推荐阅读
- json - 找到不同的子字符串后提取子字符串
- javascript - Unsplash API:如何通过浏览器检索经过身份验证的访问登录的 Access_Token?
- blazor - 如何使用 Blazor 调用 JQuery 函数
- php - Is there a way to use SELECT FOUND_ROWS() in php and mysqli?
- swiftui - SwiftUI:- 图像不会显示在视图上
- sql - 查找仅包含特定值的行
- python - PIL 的 Image.convert() 函数如何与模式“P”一起工作
- python - 我认为我在使用 Python 中的 statsmodel 包构建的回归模型中获得了不同的 AIC 和 BIC 值
- javascript - socket.remoteAddress 返回 ::1?
- php - PHP 数组发送 React Native Fetch