Azure Functions HttpTrigger整数溢出时DTO所有属性为null如何处理
解决方案
根因说明
Azure Functions HTTP触发器默认使用System.Text.Json做模型反序列化,当传入的mileage值超出int类型的取值范围时,默认的反序列化逻辑会静默失败,导致整个DTO实例绑定为null,不会进入后续的DataAnnotations校验逻辑。
解决方法
方案1:调整属性类型承接溢出值(最简方案)
将DTO中Mileage的类型从int?修改为long?,确保超范围的数值也能正常反序列化,再通过范围校验拦截不合理的值:
public class CreateVehicleDto { public string LicensePlate { get; set; } [Range(0, int.MaxValue, ErrorMessage = "里程值超出有效范围")] public long? Mileage { get; set; } public string Manufacturer { get; set; } }
函数内完成校验即可:
[FunctionName("CreateVehicle")] public async Task<ActionResult<ReadVehicleDto>> CreateVehicle([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "vehicles")] CreateVehicleDto createVehicleDto) { var validationContext = new ValidationContext(createVehicleDto); var validationResults = new List<ValidationResult>(); if (!Validator.TryValidateObject(createVehicleDto, validationContext, validationResults, validateAllProperties: true)) { return new BadRequestObjectResult(validationResults.Select(r => r.ErrorMessage)); } // 后续业务逻辑,可按需将Mileage强转为int使用 int? validMileage = (int?)createVehicleDto.Mileage; // 其余逻辑省略 }
方案2:手动反序列化请求体(兼容性最好)
不依赖自动模型绑定,直接读取原始请求流进行反序列化,可主动捕获数值溢出等反序列化异常:
[FunctionName("CreateVehicle")] public async Task<ActionResult<ReadVehicleDto>> CreateVehicle([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "vehicles")] HttpRequest req) { try { var createVehicleDto = await JsonSerializer.DeserializeAsync<CreateVehicleDto>(req.Body, new JsonSerializerOptions { NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.Strict }); // 执行DataAnnotations校验 var validationContext = new ValidationContext(createVehicleDto); var validationResults = new List<ValidationResult>(); if (!Validator.TryValidateObject(createVehicleDto, validationContext, validationResults, validateAllProperties: true)) { return new BadRequestObjectResult(validationResults.Select(r => r.ErrorMessage)); } // 业务逻辑省略 } catch (JsonException ex) { return new BadRequestObjectResult($"参数格式错误:{ex.Message}"); } }
方案3:进程内模型全局配置反序列化规则
如果使用进程内运行模型,可以通过Startup全局配置System.Text.Json的反序列化行为,全局开启严格数字校验:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using System.Text.Json; using System.Text.Json.Serialization; [assembly: FunctionsStartup(typeof(YourNamespace.Startup))] namespace YourNamespace { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.Configure<JsonSerializerOptions>(options => { options.NumberHandling = JsonNumberHandling.Strict; }); } } }
配置后反序列化错误会抛出异常,可配合全局异常过滤器统一返回400错误。
内容的提问来源于stack exchange,提问作者Stimmler
相关产品推荐
相关产品推荐

