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