从 .NET Framework 4.6 迁移到 .NET5 后,API 帖子正文为空
Posted
技术标签:
【中文标题】从 .NET Framework 4.6 迁移到 .NET5 后,API 帖子正文为空【英文标题】:API post body is null after migrating from .NET Framework 4.6 to .NET5 【发布时间】:2021-11-13 03:34:50 【问题描述】:我将 Web API 从 .NET Framework 4.6 迁移到 .NET5,并将 Entity Framework 6 升级到 Entity Framework Core 5。我遇到了一些我正在整体解决的问题,但其中一个我似乎无法解决的问题是无论我有 [FromBody] someBodyVar,只要客户端将 GUID 作为空字符串或 null 发送,但 Web API 上的模型是不可为空的 GUID,它都被设置为 null。这通常发生在有模型并具有 ID(类型为 GUID)但客户端将其设置为 null 或空字符串时,当请求是新请求时。我知道这并不理想,但是有没有办法可以覆盖该行为以使其正常工作? .NET Framework 用于将此类值自动设置为空 GUID。我真的需要获得相同的行为,因为我无法更改前端。
以下是模型示例:
[DataContract]
public class Entity
[DataMember(Name = "id")]
public Guid Id get; set;
[DataMember(Name = "groupId")]
public Guid? GroupId get; set;
[DataMember(Name = "userId")]
public Guid UserId get; set;
以下是控制器签名:
[HttpPost]
[Route("add/sessionId")]
public IActionResult AddEntity([FromRoute] Guid sessionId, [FromBody] Entity entity)
try
// entity is null here
// do logic
return Ok(response);
catch (Exception ex)
return StatusCode(500);
以下是Startup.cs中的服务注册
public void ConfigureServices(IServiceCollection services)
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
));
services.AddControllers();
services.AddSwaggerGen();
services.AddMvc(options =>
options.OutputFormatters.RemoveType<StringOutputFormatter>();
);
services.Configure<ApiBehaviorOptions>(options =>
// This fixes when we return a pure string instead of json
options.SuppressModelStateInvalidFilter = true;
);
// This is to use newtonsoft by default
services.AddMvc().AddNewtonsoftJson();
在 Angular 应用程序中,可以将 ID 设置为空字符串 (""),因为在 Angular 中,它最终是字符串而不是 GUID,因此可以将其设置为 ""。在这种情况下,实体在控制器中为空,但当前端将其设置为实际的 GUID 时,实体设置正确。
以下是从 Angular 应用程序发送的有效负载:
id: "",
userId: '211a924c-1f5f-4a3e-8cec-6ff3b89c67ac'
另外,由于图像上传,我有一些控制器使用以下内容:
JsonConvert.DeserializeObject<Entity>(HttpContext.Request.Form["entity"]);
以上内容在 .NET5 上仍然可以正常工作,但我不想更改所有功能以使用以上内容,因为我想尽可能减少我的代码更改。我想要的只是更改配置。有了上述,后端和前端都需要改变。
如前所述,上述内容在 .NET Framework 4.6 中“正常”工作。
我尝试删除 [FromBody] 但行为仍然相同。
任何帮助将不胜感激。
【问题讨论】:
[FromBody] someBodyVar
无效。请添加minimal reproducible example 而不是文字墙。您看到的差异可能是因为System.Text.Json
,您可能需要改用Newtonsoft.Json
@CamiloTerevinto 添加了一个最小的可重现示例
你能添加你从角度发送的数据吗?
@ChizT Angular 模型添加
【参考方案1】:
我们最终不得不将前端更改为不初始化 ID,而不是将其初始化为空字符串。
【讨论】:
以上是关于从 .NET Framework 4.6 迁移到 .NET5 后,API 帖子正文为空的主要内容,如果未能解决你的问题,请参考以下文章
使用 .NET 升级助手将.NET Framework应用迁移到.NET 5
已安装 4.6 时如何满足 .Net Framework 4.0 要求