发布到 ASP.NET Core 3.1 Web 应用程序时,“[FromBody]MyClass 数据”通常为空

Posted

技术标签:

【中文标题】发布到 ASP.NET Core 3.1 Web 应用程序时,“[FromBody]MyClass 数据”通常为空【英文标题】:When posting to an ASP.NET Core 3.1 web app, "[FromBody]MyClass data" is often null 【发布时间】:2020-06-17 12:24:11 【问题描述】:

我最近从 .NET Core 2.2 升级到 3.1 后遇到了这个有趣(令人沮丧)的问题。以前我会将数据发布到网络应用程序,接收方法如下所示:

public IActionResult OnPostAddNewDataAsync([FromBody]MyClass data)

    //...

MyClass 可能是这样的:

public class MyClass

    public string Field1 get; set;
    public integer Value1 get; set;

(作为参考,要从 javascript 中访问端点,您可以这样做:

 await PostDataAsync("AddNewData", 
      "Field1": "Hello I am",
      "Value1": 7
 );

async function PostDataAsync(handler, data)

    return await $.ajax(
        url: window.location.pathname + "?handler=" + handler,
        type: "POST",
        contentType: "application/json",
        headers:
        
            RequestVerificationToken: $('input:hidden[name="__RequestVerificationToken"]').val()
        ,
        data: JSON.stringify(data)
    );

我花了一段时间才弄明白!)。

这很好用。

更新 .NET Core 3.1 后,我的许多 POST 方法停止工作,[FromBody] 值将为空。

注意:作为升级到 .NET Core 3.1 的一部分,我删除了对 Newtonsoft.Json 的引用,决定尝试使用新的 System.Text.Json。事实证明这很重要!

【问题讨论】:

【参考方案1】:

如前所述,对Newtonsoft.Json 的引用已被删除,任何自动Json 转换都由System.Text.Json 处理。事实证明,这是导致问题的原因,因为 System.Text.Json 没有那么灵活(微软自己这么说,并且打算如此:How to migrate from Newtonsoft.Json to System.Text.Json)。

在 .NET Core 3 之前,ASP.NET Core 内部使用Newtonsoft.Json,现在改为使用System.Text.Json

以数字字段为例,例如MyClass.Value1。如果从 Javascript 中传递“10”或 10,Newtonsoft.Json 将处理该问题并将两者都识别为 10。默认情况下,System.Text.Json 该字段不能有引号,如果在 Json 中发布它你会是得到一个空的[FromBody] 值。

对于这些情况,最快的解决方案是恢复到Newtonsoft.Json,这很容易做到:

安装 Nuget 包Microsoft.AspNetCore.Mvc.NewtonsoftJson 在 Startup.cs 中,更新如下方法:

.

public void ConfigureServices(IServiceCollection services)

    services.AddRazorPages().AddNewtonsoftJson();

    //All your other code:
    //...

这是直接取自here。

进行此更改后,一切都再次按预期工作。

我知道System.Text.Json 可以配置自定义解析器来处理这种情况(我在其他地方使用过),但我有几十个 POST 方法,而不是更新所有这些方法以使用新方法,按照上面的描述做起来要容易得多。

【讨论】:

System.Text.Json 还没有准备好迎接黄金时段,坚持使用旧的 Newtonsoft Json。 感谢您的回答。我真的在同样的问题上苦苦挣扎。 但是 .NET 6 中没有 AddNewtonsoftJson 方法。

以上是关于发布到 ASP.NET Core 3.1 Web 应用程序时,“[FromBody]MyClass 数据”通常为空的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core--.net core 3.1 部署到 IIS

ASP.NET Core api 项目 3.1 在 IIS 上发布

ASP.NET Core 3.1 和 Angular:将 api 调用重定向到登录页面

Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作

Asp.net core 3.1 保护 API 和 Web 应用程序

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL