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...
}
我一直在尝试 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...
}