如何将ListVendors.Run输出写入Azure Function Http Trigger的responseMessage
解决方案
第一步:修改ListVendors类的Run方法,增加返回值
原来的ListVendors.Run是无返回值的void方法,所有查询结果仅输出到日志和控制台,我们需要将查询结果收集后返回,注意需要提前引入System.Text命名空间使用StringBuilder:
public static class ListVendors { // 修改返回类型为string,返回完整的供应商查询结果 public static string Run(ILogger logger) { StringBuilder resultBuilder = new StringBuilder(); OnlineClient client = Bootstrap.Client(logger); ReadByQuery query = new ReadByQuery() { ObjectName = "VENDOR", PageSize = 2, // 示例中保持数量仅为2 Fields = { "RECORDNO", "VENDORID", } }; logger.LogInformation("Executing query to Intacct API"); Task<OnlineResponse> task = client.Execute(query); task.Wait(); OnlineResponse response = task.Result; Result result = response.Results[0]; try { dynamic json = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result.Data)); string jsonString = json.ToString(); // 将第一页结果加入返回内容 resultBuilder.AppendLine("=== 第1页供应商数据 ==="); resultBuilder.AppendLine(jsonString); logger.LogDebug( "Query successful - page 1 [ Total count={0}, Data={1} ]", result.TotalCount, jsonString ); Console.WriteLine("Page 1 success! Number of vendor objects found: " + result.TotalCount + ". Number remaining: " + result.NumRemaining); } catch (NullReferenceException e) { logger.LogDebug("No response in Data. {0}", e); resultBuilder.AppendLine($"第1页查询错误:{e.Message}"); } LogManager.Flush(); int i = 1; while (result.NumRemaining > 0 && i <= 3 && !string.IsNullOrEmpty(result.ResultId)) { i++; ReadMore more = new ReadMore() { ResultId = result.ResultId }; Task<OnlineResponse> taskMore = client.Execute(more); taskMore.Wait(); OnlineResponse responseMore = taskMore.Result; Result resultMore = responseMore.Results[0]; try { dynamic resultMoreJson = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(resultMore.Data)); string resultMoreJsonString = resultMoreJson.ToString(); // 追加后续页结果 resultBuilder.AppendLine($"=== 第{i}页供应商数据 ==="); resultBuilder.AppendLine(resultMoreJsonString); logger.LogDebug( "Read More successful - page " + i + " [ Total remaining={0}, Data={1} ]", resultMore.NumRemaining, resultMoreJsonString ); Console.WriteLine("Page " + i + " success! Records remaining: " + resultMore.NumRemaining); } catch (NullReferenceException e) { logger.LogDebug("No response in Data. {0}", e); resultBuilder.AppendLine($"第{i}页查询错误:{e.Message}"); } finally { LogManager.Flush(); } } Console.WriteLine("Successfully read " + i + " pages"); resultBuilder.AppendLine($"查询完成,共读取{i}页数据"); // 返回所有收集到的结果 return resultBuilder.ToString(); } }
如果你不需要返回执行过程的日志信息,仅需要返回供应商原始数据,可以删除
resultBuilder.AppendLine的提示文字,仅保留每一页的json内容即可。
第二步:修改Azure Function代码,接收返回值并写入响应
修改Function1的Run方法,接收ListVendors.Run返回的结果,拼入responseMessage即可:
public static class Function1 { [FunctionName("HttpTrigger_1111_1")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log) { ///调用外部方法开始: ILogger logger = Bootstrap.Logger("Program"); // 接收ListVendors返回的结果 string vendorResult = ListVendors.Run(logger); ///调用外部方法结束: log.LogInformation("C# HTTP trigger function processed a request."); string name = req.Query["name"]; string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); name = name ?? data?.name; // 将供应商查询结果拼入响应内容 string baseMessage = string.IsNullOrEmpty(name) ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." : $"Hello, {name}. This HTTP triggered function executed successfully."; string responseMessage = $"{baseMessage}\n\n=== 供应商查询结果 ===\n{vendorResult}"; return new OkObjectResult(responseMessage); } }
可选优化点
- 如果需要返回结构化JSON给前端,可以把
ListVendors.Run的返回类型改成List<dynamic>或者自定义的供应商实体类集合,最后直接把集合作为OkObjectResult的参数返回,Azure Function会自动序列化为JSON格式。 - 可以把
ListVendors.Run里的task.Wait()改为async await写法,避免线程阻塞,提升Azure Function的并发性能。
内容的提问来源于stack exchange,提问作者Java
相关产品推荐
相关产品推荐

