porta microsoft management azure azure-functions

azure - microsoft - ¿Cómo uso Binder para realizar enlaces dinámicos en mi función C#?



porta azure (2)

Necesito vincularme a un blob de salida, pero la ruta del blob debe calcularse dinámicamente en mi función. ¿Cómo lo hago?


Consolidé toda la información de esta y otras publicaciones junto con comentarios y creé una publicación de blog que demuestra cómo usar Binder con un escenario del mundo real. Gracias a @mathewc esto se hizo posible.


Binder es una técnica de enlace avanzada que le permite realizar enlaces imperativamente en su código en lugar de declarativamente a través del archivo de metadatos function.json . Es posible que deba hacer esto en los casos en que el cálculo de la ruta de enlace u otras entradas deba realizarse en tiempo de ejecución en su función. Tenga en cuenta que cuando use un parámetro Binder , no debe incluir una entrada correspondiente en function.json para ese parámetro.

En el siguiente ejemplo, estamos vinculando dinámicamente a una salida de blob. Como puede ver, debido a que está declarando el enlace en el código, la información de su ruta se puede calcular de la forma que desee. Tenga en cuenta que también puede enlazar con cualquiera de los otros atributos de enlace sin procesar (por ejemplo, QueueAttribute / EventHubAttribute / ServiceBusAttribute / etc.) También puede hacerlo de forma iterativa para enlazar varias veces.

Tenga en cuenta que el parámetro de tipo pasado a BindAsync (en este caso TextWriter ) debe ser un tipo que admita el enlace de destino.

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

Y aquí están los metadatos correspondientes:

{ "bindings": [ { "name": "req", "type": "httpTrigger", "direction": "in" }, { "name": "res", "type": "http", "direction": "out" } ] }

Hay sobrecargas de enlace que toman una variedad de atributos. En los casos en los que necesita controlar la cuenta de almacenamiento de destino, pasa una colección de atributos, comenzando con el atributo de tipo de enlace (por ejemplo, BlobAttribute ) e incluyendo una instancia de StorageAccountAttribute apunta a la cuenta para usar. Por ejemplo:

var attributes = new Attribute[] { new BlobAttribute(path), new StorageAccountAttribute("MyStorageAccount") }; using (var writer = await binder.BindAsync<TextWriter>(attributes)) { writer.Write("Hello World!"); }