发布到 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
,这很容易做到:
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 中无法工作