如何使用Binder在我的C#函数中执行动态绑定?

时间:2016-10-04 14:49:57

标签: azure azure-functions

我需要绑定到输出blob,但blob路径需要在我的函数中动态计算。我该怎么做?

2 个答案:

答案 0 :(得分:24)

Binder是一种高级绑定技术,允许您在代码中执行绑定强制,而不是通过function.json元数据文件执行声明性 。如果绑定路径或其他输入的计算需要在函数运行时发生,则可能需要执行此操作。请注意,使用Binder参数时,不应function.json中为该参数添加相应的条目。

在下面的示例中,我们动态绑定到blob输出。正如您所看到的,因为您在代码中声明了绑定,所以可以按照您希望的任何方式计算路径信息。请注意,您也可以绑定到任何其他原始绑定属性(例如QueueAttribute / EventHubAttribute / ServiceBusAttribute /等。)您也可以迭代地多次绑定。< / p>

请注意,传递给BindAsync的类型参数(在本例中为TextWriter)必须是目标绑定支持的类​​型。

using System;
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}");

    // determine the path at runtime in any way you choose
    string path = "samples-output/path";

    using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute(path)))
    {
        writer.Write("Hello World!!");
    }

    return new HttpResponseMessage(HttpStatusCode.OK); 
}

以下是相应的元数据:

{
  "bindings": [
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ]
}

绑定重载采用数组属性。如果您需要控制目标存储帐户,则传入一组属性,从绑定类型属性(例如BlobAttribute)开始,并包含指向要使用的帐户的StorageAccountAttribute实例。例如:

var attributes = new Attribute[]
{
    new BlobAttribute(path),
    new StorageAccountAttribute("MyStorageAccount")
};
using (var writer = await binder.BindAsync<TextWriter>(attributes))
{
    writer.Write("Hello World!");
}

答案 1 :(得分:7)

整合了其他帖子中的所有信息以及评论,并创建了一个blog post,演示了如何将Binder与真实场景结合使用。感谢@mathewc,这成为可能。