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