Создание имен выходных больших двоичных объектов для функции Azure


Используя параметры привязки для функции Azure, можно указать имя большого двоичного объекта, которое будет записано на основе параметров, полученных из триггера (например, сообщение очереди, вызвавшее функцию); в документации приведен пример этого.

Мой вопрос: как лучше всего обрабатывать случай, когда имя blob-объекта не известно заранее, но фактически вычисляется как часть выполнения функции?

И связанный: что делать, если функция может или может не создавать выходной большой двоичный объект (или несколько выходных больших двоичных объектов!), исходя из результата его расчета?

Насколько я могу видеть сейчас, механизм привязки функции Azure не очень помогает в этих случаях, и самый простой подход-обратиться к сборке, которая делает запись blob-объекта azure "классическим способом". Но есть ли более идиоматический способ?

1 11

1 ответ:

На самом деле вы можете уже сделать это в функциях C# Azure, и у нас есть элемент отслеживания здесь, в нашем РЕПО, чтобы включить это для узла.js также функционирует. Мы скоро к этому вернемся.

Ниже приведен пример рабочей функции, которая привязывается к blob-объекту с указанным путем во время выполнения. Поскольку под обложками функции Azure построены на Azure WebJobs SDK , Вы заметите, что это зависит от использования WebJobs SDK Binder что-то, что вы, возможно, не знакомы с. Пожалуйста, смотрите WebJobs SDK для получения дополнительной документации по IBinder/Binder. В пакете SDK WebJobs для Привязок используются декларативные атрибуты (например, QueueAttribute/TableAttribute/BlobAttribute, и т.д.). Все это можно указать во время выполнения с помощью Binder. В функциях Azure мы используем внешние метаданные для описания Привязок, но в этом расширенном сценарии используется гибридный подход. Обратите внимание, что при использовании Binder нет соответствующей привязки в function.json. Подробные сведения о Binder динамических см. это так вопрос-ответ.

В общем, вы обнаружите, что многие потрясающие функции WebJobs SDK можно использовать в функциях Azure - нашему doc просто нужно догнать, чтобы люди знали об этом:)

Еще одна вещь, которую следует отметить: существует некоторая встроенная поддержка для генерации случайных новых идентификаторов для выходных данных. Например, если вы зададите путь к выходному blob-объекту test-output/{rand-guid}, система автоматически сгенерирует для вас новый идентификатор. Если это соответствует вашим потребностям, то вам не нужно 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);
}

Для вашего второго вопроса, если вы хотите условно записать в выходную привязку, просто не присваивайте ей никакого значения - никакой вывод не должен быть произведен.