从 .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 要求

发布在 C# .net framework 4.6 中开发的 Web API 的命令 [重复]

.net framework 4.6 无法安装

win10 怎么安装.net framework 4.6

如何在新的 .NET Framework 4.6 中启用 SIMD?