Как использовать Binder для выполнения динамических привязок в моей функции C#?

Мне нужно привязать к выходному BLOB-объекту, но путь BLOB-объекта должен динамически вычисляться в моей функции. Как мне это сделать?

2 ответа

Решение

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

Объединили всю информацию из этого и других постов вместе с комментариями и создали пост в блоге, который демонстрирует, как использовать Binder в реальном сценарии. Благодаря @mathewc это стало возможным.

Другие вопросы по тегам