0

我一直试图在队列触发函数 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; }
}

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

4

2 回答 2

1

队列触发的 Azure Functions 没有 http 函数 URL,并且具有输出绑定,而不是返回。如果您需要返回对象的 JSON 版本,则需要使用 HTTP 触发的函数(可以将 HTML/JSON/等返回给调用者),而不是队列。如果您必须使用队列,则需要使用您创建的绑定或自定义代码将数据输出到其他源。如果您解释您的用例/需要更多,可能会详细说明解决方案。

更新:

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

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

private static HttpClient httpClient = new HttpClient();

然后使用该 httpClient 将您的数据作为 JSON 发布:

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

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

于 2020-12-01T21:11:20.507 回答
0

您正在为表使用输入绑定,使用输出绑定

如果要插入单行,可以[return: Table("MyTable")]在函数上使用,然后返回单条记录作为函数的返回值。

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>的。

[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...
}
于 2020-12-01T21:26:04.060 回答