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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:06:03