为Azurefunction生成输出blob的名称

使用Azurefunction的绑定选项,可以根据从触发器派生的参数(例如,触发该function的队列消息)指定要写入的Blob的名称; 文档显示了一个例子。

我的问题是:处理blob名称事先不知道的情况的最佳方法是什么,但实际上是作为函数执行的一部分计算的?

并且相关:如果函数可能会或可能不会产生输出blob(或多个输出blob!),根据其计算结果怎么办?

据我所知,Azure Function的绑定机制在这些情况下没有多大帮助,最简单的方法是引用一个用azure blob编写“经典方式”的程序集。 但是有更惯用的方式吗?

实际上你可以在C#Azure Functions中使用它,我们在repo中有一个跟踪项,以便为Node.js函数启用它。 我们很快就会到达那里。

下面是一个示例工作函数,它使用运行时指定的路径绑定到blob。 由于Azurefunction是基于Azure WebJobs SDK构建的,因此您会注意到这依赖于使用您可能不熟悉的WebJobs SDK Binder 。 有关IBinder / Binder更多文档,请参阅WebJobs SDK。 在WebJobs SDK中,声明性属性用于绑定(例如QueueAttribute / TableAttribute / BlobAttribute等)。 您可以通过Binder在运行时指定所有这些。 在Azure Functions中,我们使用外部元数据来描述绑定,但在此高级方案中,您可以使用混合。 请注意,使用Binder时, function.json没有相应的绑定。 有关Binder动态绑定的更多详细信息,请参阅此 SO问题/答案。

一般来说,你会发现很多很棒的WebJobs SDKfunction都可以在Azurefunction中使用 – 我们的文档需要赶上让人们意识到这一点:)

另外需要注意的是:有一些内置支持为输出生成随机新标识符。 例如,如果要将输出blob路径设置为test-output / {rand-guid} ,系统将自动为您生成新ID。 如果这符合您的需求,那么您不需要Binder

 using System; using System.IO; using System.Net; using Microsoft.Azure.WebJobs; public static async Task Run(HttpRequestMessage req, Binder binder, TraceWriter log) { log.Verbose($"C# HTTP function processed RequestUri={req.RequestUri}"); using (var writer = await binder.BindAsync( new BlobAttribute("test-output/result"))) { writer.Write("Hello World!!"); } return new HttpResponseMessage(HttpStatusCode.OK); } 

对于第二个问题,如果要有条件地写入输出绑定,只是不要为绑定分配任何值 – 不应生成任何输出。