使用Azure功能的绑定选项,可以根据从触发器派生的参数(例如,触发该功能的队列消息)指定要写入的Blob的名称;文档显示了一个例子。
我的问题是:处理blob名称事先不知道的情况的最佳方法是什么,但实际上是 计算 作为函数执行的一部分?
并且相关:如果函数可能会或可能不会产生输出blob(或多个输出blob!),根据其计算结果怎么办?
据我所知,Azure Function的绑定机制在这些情况下没有多大帮助,最简单的方法是引用一个用azure blob编写“经典方式”的程序集。但是有更惯用的方式吗?
实际上你可以在C#Azure Functions中使用它,我们有一个跟踪项 在我们的回购中 为Node.js函数启用此功能。我们很快就会到达那里。
下面是一个示例工作函数,它使用指定的路径绑定到blob 在运行时。从根本上来说,Azure Functions是建立在 Azure WebJobs SDK,你会发现这依赖于使用WebJobs SDK Binder
你可能不熟悉的东西。有关更多文档,请参阅WebJobs SDK IBinder
/Binder
。在WebJobs SDK中,声明性属性用于绑定(例如 QueueAttribute
/TableAttribute
/BlobAttribute
等)。您可以在运行时通过指定所有这些 Binder
。在Azure Functions中,我们使用外部元数据来描述绑定,但在此高级方案中,您可以使用混合。请注意,使用时 Binder
没有相应的约束力 function.json
。有关详细信息 Binder
动态绑定见 这个 所以问题/答案。
一般来说,你会发现很多很棒的WebJobs SDK功能都可以在Azure功能中使用 - 我们的文档需要赶上让人们意识到这一点:)
另外需要注意的是:有一些内置支持为输出生成随机新标识符。例如。如果要将输出blob路径设置为 测试输出/ {兰特-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);
}
对于第二个问题,如果要有条件地写入输出绑定,只是不要为绑定分配任何值 - 不应生成任何输出。