【发布时间】: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