使用Azure功能的绑定选项,可以根据从触发器派生的参数(例如,触发该功能的队列消息)指定要写入的Blob的名称;文档显示了一个例子。
我的问题是:处理blob名称事先未知的情况的最佳方法是什么,但事实上计算是函数执行的一部分?
并且相关:如果函数可能会或可能不会产生输出blob(或多个输出blob!),根据其计算结果怎么办?
据我所知,Azure Function的绑定机制在这些情况下没有多大帮助,最简单的方法是引用一个用azure blob编写“经典方式”的程序集。但是有更惯用的方式吗?
答案 0 :(得分:16)
您可以在C#Azure Functions中实际使用此功能,并且我们还有一个跟踪项here in our repo,以便为Node.js函数启用此功能。我们很快就会谈到这一点。
下面是一个示例工作函数,它使用在运行时指定的路径绑定到blob。由于Azure函数是基于Azure WebJobs SDK构建的,因此您会注意到这依赖于使用您可能不熟悉的WebJobs SDK Binder
。有关IBinder
/ Binder
的更多文档,请参阅WebJobs SDK。在WebJobs SDK中,声明性属性用于绑定(例如QueueAttribute
/ TableAttribute
/ BlobAttribute
等)。您可以通过Binder
在运行时指定所有这些内容。在Azure Functions中,我们使用外部元数据来描述绑定,但在此高级方案中,您可以使用混合。请注意,使用Binder
时,function.json
中没有相应的绑定。有关Binder
动态绑定的详细信息,请参阅this SO问题/答案。
通常,您会发现很多很棒的WebJobs SDK功能都可以在Azure功能中使用 - 我们的文档需要赶上让人们意识到这一点:)
还有一点需要注意:有一些内置支持为输出生成随机新标识符。例如。如果您要将输出blob路径设置为 test-output / {rand-guid} ,系统将自动为您生成新ID。如果符合您的需求,那么您不需要Binder
。
using System;
using System.IO;
using System.Net;
using Microsoft.Azure.WebJobs;
public static async Task<HttpResponseMessage>
Run(HttpRequestMessage req, Binder binder, TraceWriter log)
{
log.Verbose($"C# HTTP function processed RequestUri={req.RequestUri}");
using (var writer = await binder.BindAsync<TextWriter>(
new BlobAttribute("test-output/result")))
{
writer.Write("Hello World!!");
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
对于第二个问题,如果要有条件地写入输出绑定,只是不要为绑定赋值 - 不应该生成输出。