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

How do I use Binder to perform dynamic bindings in my C# Function?

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

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

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

请注意,传递给 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!");
}

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