【问题标题】:API post body is null after migrating from .NET Framework 4.6 to .NET5从 .NET Framework 4.6 迁移到 .NET5 后,API 帖子正文为空
【发布时间】: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 模型添加

标签: c# angular asp.net-core asp.net-core-5.0


【解决方案1】:

我们最终不得不将前端更改为不初始化 ID,而不是将其初始化为空字符串。

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2013-01-15
    • 2020-04-11
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多