.NET 8 Azure Functions中[FromBody]参数绑定失败的解决问询
在.NET 8 Azure Functions Isolated Worker中使用[FromBody]绑定请求体的解决方案
问题原因
你使用的是Azure Functions Isolated Worker模型(从引用的Microsoft.Azure.Functions.Worker系列包和ConfigureFunctionsWebApplication配置可判断),而ASP.NET Core的[FromBody]特性并非该模型的原生绑定特性,直接使用会导致请求体无法正确绑定,参数始终为null。
解决方案
方案1:使用Isolated Worker原生的[RequestBody]特性(推荐)
Isolated Worker模型提供了专门的[RequestBody]特性用于请求体绑定,替换[FromBody]即可解决问题:
- 确保项目已引用
Microsoft.Azure.Functions.Worker包 - 修改函数代码,将
[FromBody]替换为[RequestBody]:
[Function("GetAllPriceList")] public IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = "PriceList/GetAllPriceList")] HttpRequestData req, [RequestBody] AccountRequest accountRequest) { if (accountRequest == null) { return new BadRequestObjectResult("无效的请求体"); } // 业务逻辑处理 return new OkObjectResult($"获取到AccountId:{accountRequest.AccountId}"); }
方案2:配置启用ASP.NET Core风格绑定(支持[FromBody])
如果坚持要使用[FromBody],可以通过配置启用ASP.NET Core的绑定支持:
- 在
Program.cs中添加MvcCore配置:
var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { services.AddMvcCore() .AddJsonOptions(options => { // 配置JSON序列化规则,确保和请求体格式匹配 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); }) .Build(); host.Run();
- 修改函数参数为ASP.NET Core的
HttpRequest类型,并保留[FromBody]:
[Function("GetAllPriceList")] public IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = "PriceList/GetAllPriceList")] HttpRequest req, [FromBody] AccountRequest accountRequest) { if (accountRequest == null) { return new BadRequestObjectResult("无效的请求体"); } // 业务逻辑处理 return new OkObjectResult($"获取到AccountId:{accountRequest.AccountId}"); }
关键注意事项
- 确保请求的
Content-Type头设置为application/json,Postman中需正确配置该头信息,否则绑定会失败 - 若JSON键名和类属性名存在大小写差异,可通过配置
JsonSerializerOptions.PropertyNameCaseInsensitive = true来忽略大小写匹配
内容的提问来源于stack exchange,提问作者davewilliams459
相关产品推荐
相关产品推荐

