.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:自定义转换器实现自动绑定
如果你希望保留原来的自动绑定写法,可以自行实现输入转换器并注册到运行时:
- 新增自定义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请求体反序列化失败"); } } }
- 在项目的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
相关产品推荐
相关产品推荐

