本地VS2022中WebApp调用Azure Function遇HttpRequest实例化错误
问题解决:Azure Function HttpRequest绑定实例化错误
错误原因
你的Web应用向Function POST了SalesRequest的JSON数据,但Function的HttpRequest req参数是请求上下文对象,运行时错误地尝试将传入的JSON反序列化为HttpRequest接口(接口无法实例化),因此抛出异常。
解决方案
提供两种可行修复方式,任选其一即可:
方式1:手动读取请求Body并反序列化
修改Function的Run方法,从HttpRequest中读取请求Body,再转换为SalesRequest对象:
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, [Queue("SalesRequestInbound", Connection = "AzureWebJobsStorage")] IAsyncCollector<SalesRequest> SalesRequestQueue, TraceWriter log) { log.Info("Processing request to add message to queue"); // 读取请求Body内容 string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); // 反序列化为SalesRequest对象 SalesRequest salesRequest = JsonConvert.DeserializeObject<SalesRequest>(requestBody); if (salesRequest == null) { return new BadRequestObjectResult("Invalid request data"); } // 将对象加入队列 await SalesRequestQueue.AddAsync(salesRequest); return new OkObjectResult("Message added to queue successfully"); }
方式2:直接绑定到实体类(更简洁)
修改Function的HttpTrigger参数,直接指定为SalesRequest,运行时会自动完成请求Body的反序列化:
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] SalesRequest salesRequest, [Queue("SalesRequestInbound", Connection = "AzureWebJobsStorage")] IAsyncCollector<SalesRequest> SalesRequestQueue, TraceWriter log) { log.Info("Processing request to add message to queue"); if (salesRequest == null) { return new BadRequestObjectResult("Invalid request data"); } await SalesRequestQueue.AddAsync(salesRequest); return new OkObjectResult("Message added to queue successfully"); }
注意事项
Web应用的请求发送代码无需修改,保持原有的POST JSON格式即可。
内容的提问来源于stack exchange,提问作者Mitali
相关产品推荐
相关产品推荐

