2016-04-05 14 views
10

Używając opcji powiązania dla funkcji Azure można określić nazwę Bloba do zapisania na podstawie parametrów wyprowadzonych z wyzwalacza (np. Komunikat kolejki, który uruchomił funkcję); dokumentacja pokazuje przykład tego.Generowanie nazw dla bloków wyjściowych dla funkcji Azure

Moje pytanie brzmi: jaki jest najlepszy sposób na obsługę przypadku, w którym nazwa kropelki nie jest znana z góry, ale w rzeczywistości jest obliczona w ramach realizacji funkcji?

I powiązane: co zrobić, jeśli funkcja może, ale nie musi, wytworzyć blob wyjściowy (lub wiele bloków danych wyjściowych!), Na podstawie wyniku jego obliczeń?

Z tego, co widzę, mechanizm wiążący funkcji Azure nie pomaga w tych przypadkach, a najprostszym rozwiązaniem jest odwołanie się do zestawu, który robi "klasyczny sposób". Ale czy istnieje bardziej idiomatyczny sposób?

+0

Zaktualizowana odpowiedź z brakującymi informacjami to [tutaj] (http://stackoverflow.com/questions/39855409/how-do-i-use-binder-to-perform-dynamic-bindings-in-my-c-sharp -funkcjonować). –

Odpowiedz

15

Możesz już to zrobić w funkcjach C# Azure, a my mamy element śledzący here in our repo, aby włączyć to również dla funkcji Node.js. Wkrótce dojdziemy do tego.

Poniżej znajduje się przykładowa funkcja robocza, która łączy się z obiektem typu blob ze ścieżką określoną jako w środowisku wykonawczym. Ponieważ pod okładkami Azure Functions jest zbudowany na Azure WebJobs SDK, zauważysz, że polega to na korzystaniu z WebJobs SDK Binder czegoś, co być może nie jest Ci obce. Więcej informacji na ten temat można znaleźć w pakiecie WebJobs SDK pod adresem IBinder/Binder. W pakiecie WebJobs SDK deklaracje atrybutów są używane do powiązań (np. QueueAttribute/TableAttribute/ itp.). Wszystkie te można określić w środowisku wykonawczym pod numerem Binder. W Azure Functions do opisu powiązań używamy zewnętrznych metadanych, ale w tym zaawansowanym scenariuszu masz hybrydę. Należy zauważyć, że przy użyciu Binder nie ma odpowiedniego wiązania w function.json. Aby uzyskać więcej informacji na temat wiązań dynamicznych Binder, zobacz this SO pytanie/odpowiedź.

W ogóle, przekonasz się, że wiele wspaniałych cech WebJobs SDK są używane w funkcjach Azure - nasza doc po prostu musi nadrobić zaległości, aby ludzie świadomi tego :)

jedna rzecz do uwaga: nie ma trochę wbudowanej obsługi generowania losowych nowych identyfikatorów dla wyjść. Na przykład. jeśli ustawisz wyjściową ścieżkę blobową na test-output/{rand-guid} system automatycznie wygeneruje dla ciebie nowy ID. Jeśli to spełnia twoje potrzeby, nie potrzebujesz 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); 
} 

Na drugie pytanie, czy chcesz pisać warunkowo do wyjścia wiązania, po prostu nie przypisać dowolną wartość do wiązania - nie ma wyjścia powinny być produkowane.

+2

Czy powinieneś użyć 'using' na nagrywarce, aby upewnić się, że zostanie zamknięty? –

+0

Zaktualizowany kod, aby dodać instrukcję użycia. – mathewc

+2

fajne! Nie znałem "sztuczki" IBIER'a, co zrobiłem: 'var container = outBlob.Container; var newOutBlob = container.GetBlockBlobReference (newFileName); ': $ – Nicolocodev