You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:39:01