17

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

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

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

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

4

1 回答 1

23

您实际上已经可以在 C# Azure Functions 中执行此操作,并且我们在我们的存储库中有一个跟踪项,以便也为 Node.js Functions 启用此功能。我们很快就会做到这一点。

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

通常,您会发现 Azure Functions 中可以使用许多很棒的 WebJobs SDK 功能 - 我们的文档只需要跟上步伐,让人们意识到这一点 :)

另一件需要注意的事情:有一些内置支持可以为输出生成随机的新标识符。例如,如果您将输出 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);
}

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

于 2016-04-05T16:39:05.520 回答