问题 为Azure功能生成输出blob的名称


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

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

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

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


7820
2018-04-05 13:43


起源

缺少信息的更新答案是 这里。 - Sean Feldman


答案:


实际上你可以在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);
}

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


16
2018-04-05 16:39



你应该有吗? using 在作家,以确保它被关闭? - David Ebbo
更新了代码以添加using语句。 - mathewc
凉!我不知道IBinder“技巧”我做的是: var container = outBlob.Container; var newOutBlob = container.GetBlockBlobReference(newFileName); :$ - Nicolocodev
@mathewc IBinder是否也适用于其他输出?我尝试使用SaasFile输出做类似的事情,但无法使其工作。问题是 这里如果你有机会 - DBueno
Binder / IBinder参数在function.json中没有表示。我将澄清上面的答案。我们也改变了rand-guid语法,我也会修复它。关于Binder场景的更具描述性的帖子如下: stackoverflow.com/questions/39855409/... - mathewc