【问题标题】:Azure Functions HttpTrigger all properties null on int overflowAzure Functions HttpTrigger 所有属性在 int 溢出时为空
【发布时间】:2021-09-15 16:51:10
【问题描述】:

我使用一些 Azure Functions 作为 WebApi。现在我有以下 DTO 来创建车辆:

public class CreateVehicleDto
{
    public string LicensePlate { get; set; }
    public int? Mileage { get; set; }
    public string Manufacturer { get; set; }
}

我的方法头是这样的:

[FunctionName("CreateVehicle")]
public async Task<ActionResult<ReadVehicleDto>> CreateVehicle([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "vehicles")] CreateVehicleDto createVehicleDto){}

问题是,当我的客户发送的里程高于int.MaxValue 时,DTO 的所有属性都是null,并且该方法运行时不会抛出任何异常。

有没有办法解决这个问题?如果里程太高,我想返回BadRequestResult

我还尝试使用System.ComponentModel.DataAnnotations 设置像[Range(0, int.MaxValue)] 这样的最大值,并使用System.ComponentModel.DataAnnotations.Validator 对其进行验证。但是当对象得到验证时已经太晚了,因为 DTO 的所有属性都被传递到了值为null 的方法中。

【问题讨论】:

  • 为了进行本地测试,尝试将 Mileage 更新为 string 类型,并在 CreateVehicle 方法中使用 int.TryParse 相应地返回 BadRequestResult。我很好奇为什么里程溢出时所有属性都为空int
  • 是的,这将是一种解决方法,但有什么方法可以解决这个问题,比如在中间件或其他东西中。我也很好奇为什么 api 没有抛出异常或返回 500 结果,而是继续运行并将所有属性设置为 null。
  • 我猜这是因为对象的反序列化失败,您根本无法部分反序列化对象。所以你想要的是不可行的。您还可以将 int 更改为 long 以允许更大的值,然后尝试将其解析为代码中的 int。
  • long as 类型的解决方案不会改变任何东西,因为客户端可以发送一个高于最大 long 值的值,这会导致同样的问题。当反序列化失败时,应该抛出一个异常,然后您可以在中间件中处理该异常。因此,当 azure 函数中的中间件得到适当支持时,我正在等待 .NET 6。

标签: c# asp.net .net api azure-functions


【解决方案1】:

谢谢nikneem。发布您的建议作为帮助其他社区成员的答案。

这是因为对象的反序列化失败,您可以简单地 partially deserialize 一个对象。

您还可以将int 更改为long 以允许更大的值,然后尝试在您的代码中将其解析回int

可以参考Azure Functions V2 Deserialize HttpRequest as object

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 2020-12-13
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多