Return Table 队列触发器函数中的数据

Return Table Data in Queue Trigger function

我一直在尝试 return Table 在队列触发器函数 URL 中返回存储行,但未能成功。下面是我的代码。

public static async Task<List<PatchesList>> Run([QueueTrigger("send-patches-list", Connection = 
"AzureWebJobsStorage")]string myQueueItem, [Table(tableName: "getpatcheslist", Connection = 
"AzureWebJobsStorage")]CloudTable cloudTable, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");

    TableQuery<PatchesList> projectionQuery = new TableQuery<PatchesList>().Select(
new string[] { "RowKey", "Name" });

    var grouprows = await cloudTable.ExecuteQuerySegmentedAsync(projectionQuery, null);
    List<PatchesList> groupslist = new List<PatchesList>();
    log.LogInformation($"C# Queue trigger function processed: {grouprows}");
    foreach (var c in grouprows.Results)
    {
        groupslist.Add(new PatchesList
        {
            RowKey = c.RowKey,
            Name = c.Name
        });
        log.LogInformation($"C# Queue trigger function processed: {groupslist[0].Name}");
    }

    return groupslist;
}

public class PatchesList : TableEntity
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public string Name { get; set; }
}

我在发回数据时遇到问题,这种方法可行吗,队列触发器可以发回响应吗?

队列触发的 Azure Functions 没有 http 函数 URL 并且有输出绑定,而不是 returns。如果你需要 return 对象的 JSON 版本,那么你需要使用 HTTP 触发的函数(可以 return HTML/JSON/etc 到调用者),而不是队列。如果您必须使用队列,则需要使用您创建的绑定或自定义代码将数据输出到其他来源。如果你多解释一下你的使用case/needs,也许可以详细说明一个解决方案。

更新:

因此,根据您的评论,您想要获取您的 groupsList 并将其发送到 HTTP 端点 (a URL)。如果那是正确的,那么您只需要使用 HttpClient 来 POST 数据到那个 URL...没有输出绑定。

首先,对于函数,最好使用 HttpClient 的静态副本(参见 https://docs.microsoft.com/en-us/azure/azure-functions/manage-connections),因此您可以在函数上方添加以下行:

private static HttpClient httpClient = new HttpClient();

然后使用那个 httpClient POST 你的数据作为 JSON:

var json = JsonConvert.SerializeObject(groupsList);
var content = new StringContent(json, UnicodeEncoding.UTF8, "application/json");
var response = await httpClient.PostAsync(<yourUrl>, content);

如果您想验证是否成功,您可以检查响应,甚至可以使用第 3 方库(如 Polly)在请求失败时重试请求。 POST 完成后,您就完成了。没有 return 或函数的输出绑定,因为它在技术上没有输出。

您正在使用 input binding for table, use output binding

如果您想插入一行,您可以在函数中使用 [return: Table("MyTable")],然后 return 一条记录作为函数的 return 值。

public class TableStorage
{
    public class MyPoco
    {
        public string PartitionKey { get; set; }
        public string RowKey { get; set; }
        public string Text { get; set; }
    }

    [FunctionName("TableOutput")]
    [return: Table("MyTable")]
    public static MyPoco TableOutput([HttpTrigger] dynamic input, ILogger log)
    {
        log.LogInformation($"C# http trigger function processed: {input.Text}");
        return new MyPoco { PartitionKey = "Http", RowKey = Guid.NewGuid().ToString(), Text = input.Text };
    }
}

如果要插入多行,则必须使用 ICollector<T> 作为 described here

[FunctionName("TableOutput")] // don't forget this one
public static async Task<List<PatchesList>> Run(
    [QueueTrigger("send-patches-list", Connection = "AzureWebJobsStorage")]string myQueueItem,
    ICollector<PatchesList> outTable, ILogger log)
{
    // ...your code...
    // insert into outTable
    // some examples here: https://www.mudbath.com.au/insight/a-simple-guide-to-azure-table-storage-in-c/
    // ...your code...
}