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

时间:2016-04-05 13:43:57

标签: c# azure azure-functions

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

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

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

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

1 个答案:

答案 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);
}

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