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

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

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

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

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


person Luc C    schedule 05.04.2016    source источник
comment
Обновленный ответ с отсутствующей информацией: здесь.   -  person Sean Feldman    schedule 05.10.2016


Ответы (1)


Фактически вы уже можете это сделать в C # Azure Functions, и у нас есть элемент отслеживания здесь, в нашем репозитории, чтобы включить это и для функций Node.js. Мы скоро к этому вернемся.

Ниже приведен пример рабочей функции, которая связывается с большим двоичным объектом с путем, указанным во время выполнения. Поскольку внутренние функции Azure построены на Azure WebJobs SDK, вы заметите, что здесь используется SDK WebJobs Binder, с которым вы, возможно, не знакомы. Дополнительную документацию по _2 _ / _ 3_ см. В SDK WebJobs. В SDK WebJobs декларативные атрибуты используются для привязок (например, _4 _ / _ 5 _ / _ 6_ и т. Д.). Вы можете указать все это во время выполнения через Binder. В Функциях Azure мы используем внешние метаданные для описания привязок, но в этом расширенном сценарии у вас есть гибрид. Обратите внимание, что при использовании Binder в function.json нет соответствующей привязки. Подробнее о Binder динамических привязках см. это ТАК вопрос / ответ.

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

Еще одно замечание: есть встроенная поддержка для генерации случайных новых идентификаторов для выходных данных. Например. если вы установите путь к выходному 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);
}

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

person mathewc    schedule 05.04.2016
comment
Должны ли вы иметь using на писателе, чтобы убедиться, что он закрывается? - person David Ebbo; 05.04.2016
comment
Круто! Я не знал трюка IBinder, что я сделал: var container = outBlob.Container; var newOutBlob = container.GetBlockBlobReference(newFileName);: $ - person nicolocodev; 21.07.2016
comment
@mathewc Работает ли IBinder и для других выходов? Я попытался сделать что-то подобное с выводом SaasFile, но не смог заставить его работать. Вопрос в следующем: здесь, если у вас будет возможность. - person DBueno; 26.09.2016
comment
@mathewc, можете ли вы обновить свой ответ, включив в него файл function.json, соответствующий приведенному выше коду? Я пытаюсь более четко понять, как параметр IBinder относится к привязке вывода большого двоичного объекта в function.json. - person Chris Gillum; 10.12.2016
comment
Другой вопрос: это% rand-guid% или {rand-guid}? Вы упомянули% rand-guid%, но в документации указано {rand-guid}. docs.microsoft.com/en- us / azure / azure-functions / - person Chris Gillum; 10.12.2016
comment
Параметры Binder / IBinder не представлены в function.json. Я поясню свой ответ выше. Также мы изменили синтаксис rand-guid, я это тоже исправлю. Более подробное сообщение о сценариях Binder находится здесь: stackoverflow.com/questions/39855409/ - person mathewc; 10.12.2016
comment
@mathewc - Есть ли способ привязать очереди хранилища вместо хранилища BLOB-объектов с помощью функций Azure? Вместо этого я попытался использовать QueueAttribute, но получаю сообщение об ошибке при попытке использовать связыватель для привязки к очереди. CloudQueue outputQueue = binder.Bind ‹CloudQueue› (queueAttribute); Ошибка: не удалось найти тип или имя пространства имен CloudQueue (вам не хватает директивы using или ссылки на сборку?) - person Vineet; 11.01.2017
comment
Да, это работает для всех атрибутов. Вам просто нужно добавить правильные ссылки на сборку #r и операторы using. В этом случае #r "Microsoft.WindowsAzure.Storage" и using Microsoft.WindowsAzure.Storage.Queue. Я уже упоминал об этом выше в своем ответе. - person mathewc; 11.01.2017
comment
хотелось бы знать, что вы имеете в виду под just don't assign any value to the binding ?? - person Alex Gordon; 30.03.2019
comment
если возможно, не могли бы вы обновить этот ответ, если считаете, что существует более идиоматический способ выполнения условных привязок вывода? - person Alex Gordon; 30.03.2019