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

.NET 5独立进程Azure Function HTTP触发器无法绑定JSON请求模型

问题根因

.NET 5 独立进程(out-of-proc)模型的 Azure Function 运行时默认没有提供 HTTP 请求体到自定义 POCO 类的自动绑定转换器,所以运行时会尝试直接把底层的 GrpcHttpRequestData 对象转换成你定义的 Chip 类型,直接触发转换失败异常,这和你传参、请求头、JSON 格式都没有关系。

解决方案

方案1:手动反序列化请求体(推荐,适配性最高)

不需要修改任何配置,直接从 HttpRequestData 中读取请求流自行反序列化即可,修改后的函数代码如下:

[Function("AddChip")]
public async Task<HttpResponseData> AddChip([HttpTrigger(AuthorizationLevel.Anonymous,
 "post", Route = "chip")] HttpRequestData req, FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("Function1");
    logger.LogInformation("C# HTTP trigger function processed a request.");

    // 手动读取请求体反序列化为Chip对象
    using var reader = new StreamReader(req.Body);
    var requestBody = await reader.ReadToEndAsync();
    var chip = System.Text.Json.JsonSerializer.Deserialize<Chip>(requestBody);

    // 可选参数校验逻辑
    if (chip == null)
    {
        var badRequestResp = req.CreateResponse(HttpStatusCode.BadRequest);
        await badRequestResp.WriteStringAsync("请求体格式不符合要求");
        return badRequestResp;
    }

    var result = await _chipService.UpsertChipAsync(chip);
    var response = req.CreateResponse(HttpStatusCode.OK);
    await response.WriteAsJsonAsync(result);
    return response;
}

方案2:自定义转换器实现自动绑定

如果你希望保留原来的自动绑定写法,可以自行实现输入转换器并注册到运行时:

  1. 新增自定义JSON转换器类
using Microsoft.Azure.Functions.Worker.Converters;
using Microsoft.Azure.Functions.Worker.Http;
using System.Text.Json;

public class HttpRequestJsonConverter : IFunctionInputConverter
{
    public async ValueTask<ConversionResult> ConvertAsync(ConverterContext context)
    {
        // 仅处理HTTP请求来源的转换请求
        if (context.Source is not HttpRequestData httpRequest)
        {
            return ConversionResult.Unhandled();
        }

        try
        {
            using var reader = new StreamReader(httpRequest.Body);
            var jsonContent = await reader.ReadToEndAsync();
            var deserializedObj = JsonSerializer.Deserialize(jsonContent, context.TargetType);
            return ConversionResult.Success(deserializedObj);
        }
        catch
        {
            return ConversionResult.Failed("JSON请求体反序列化失败");
        }
    }
}
  1. 在项目的Program.cs中注册转换器
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(builder =>
    {
        // 注册自定义的HTTP请求JSON转换器
        builder.InputConverterOptions.Converters.Add(new HttpRequestJsonConverter());
    })
    .Build();

host.Run();

注册完成后你原来的函数签名就可以正常使用自动绑定逻辑了。

注意事项

确保项目引用的 Microsoft.Azure.Functions.Worker 和 Microsoft.Azure.Functions.Worker.Extensions.Http 包版本适配.NET 5,推荐使用1.x分支的稳定版本,不要升级到2.x及以上版本,2.x版本最低运行要求为.NET 6。


内容的提问来源于stack exchange,提问作者Antonio Dlp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:15:02