Die Standard-Eingabe- und Ausgabebindungen in Azure Functions werden in einem deklarativen Muster unter Verwendung der function.json geschrieben. Wenn Sie Eingaben und Ausgaben deklarativ definieren, haben Sie nicht die Möglichkeit, einige der Bindungseigenschaften wie den Namen zu ändern oder mehrere Ausgaben aus einer Eingabe zu machen. Eine imperative Bindung kann dies für Sie tun. In diesem Blogbeitrag zeige ich Ihnen, wie Sie imperative Blob-Bindungen verwenden können. Imperatives Binder-Muster Der imperative Binder verwendet ein Muster, bei dem Sie das Binder-Objekt in der Signatur Ihrer Run-Methode hinzufügen. In der Funktion verwenden Sie Attribute, um die Ausgabe an das Binder-Objekt zu binden. Sie können mehrere Ausgaben an den Binder binden und Sie können eine deklarative Bindung mit der imperativen Bindung kombinieren. In diesem Fall ist der BlobTrigger in function.json definiert. Nehmen Sie die Ausgabebindung nicht in Ihre function.json auf:
public static async Task Run(string input, Binder binder)
{
...
var attributes = new Attribut[]
{
new BlobAttribute("samples-output/path"),
new StorageAccountAttribute("MeinStorageAccount")
};
T output = await binder.BindAsync<T>(Attribute);
Ausgabe. ...;
}
{
"Bindungen": [
{
"Name": "Eingabe",
"Typ": "blobTrigger",
"Richtung": "in",
"Pfad": "test/{name}",
"Verbindung": ""
}
],
"deaktiviert": false
}
Umbenennen eingehender BLOBs Das Umbenennen eines BLOBs ist im Grunde ein zweistufiger Prozess. Der erste Schritt besteht darin, den Inhalt des BLOBs in eine neue BLOB-Datei zu kopieren und der zweite Schritt ist das Löschen des ursprünglichen BLOBs. Blob kopieren Der erste Schritt besteht darin, den Blob in einen neuen Blob zu kopieren. Der neue Blobname basiert auf der aktuellen Datumsangabe im Pfad. Der folgende Code zeigt, wie Sie dies mit einem Binder tun können:
#r "Microsoft.WindowsAzure.Storage"
mit Microsoft.WindowsAzure.Storage.Blob;
public static async Task Run(string input, string name, Binder binder, TraceWriter log)
{
log.Info($"C# Blob-Trigger-Funktion verarbeitet: {name} ({input.Count()})");
string path = $"testcontainer/{DateTime.UtcNow.ToString("yyyy/MM/dd/HH")}/"+name;
var attributes = new Attribut[]
{
new BlobAttribute(Pfad),
new StorageAccountAttribute("")
};
using (var writer = await binder.BindAsync<TextWriter>(Attribute))
{
writer.Write(input);
}
}
Die function.json ist die gleiche wie in Beispiel 1.
Blob löschen Das Löschen des ursprünglichen Blobs kann sowohl deklarativ als auch imperativ erfolgen. Ich werde beides zeigen:
Blob löschen deklarativ Alle Parameter werden in der function.json deklariert:
{
"Bindungen": [
{
"Name": "Eingabe",
"Typ": "blobTrigger",
"Richtung": "in",
"Pfad": "test/{name}",
"Verbindung": ""
},
{
"Typ": "Ausgabe",
"Name": "Ausgabe",
"Richtung": "inout",
"Pfad": "test/{name}",
"Verbindung": ""
}
],
"deaktiviert": false
}
#r "Microsoft.WindowsAzure.Storage"
mit Microsoft.WindowsAzure.Storage.Blob;
public static async Task Run(string input, string name, CloudBlockBlob output, TraceWriter log)
{
log.Info($"C# Blob-Trigger-Funktion verarbeitet: {name} ({input.Count()})");
output.Delete();
}
Dadurch wird die eingehende Blob-Datei gelöscht (der Pfad in der function.json ist für die Eingabe und die Ausgabe derselbe).
Blob löschen Sie können den eingehenden Blob auch zwingend mit dem Binder löschen:
{
"Bindungen": [
{
"Name": "Eingabe",
"Typ": "blobTrigger",
"Richtung": "in",
"Pfad": "test/{name}",
"Verbindung": ""
}
],
"deaktiviert": false
}
#r "Microsoft.WindowsAzure.Storage"
mit Microsoft.WindowsAzure.Storage.Blob;
public static async Task Run(string input, string name, Binder binder, TraceWriter log)
{
log.Info($"C# Blob-Trigger-Funktion verarbeitet: {name} ({input.Count()})");
var attributesOrg = new Attribut[]
{
new BlobAttribute($"test/{name}"),
new StorageAccountAttribute("")
};
var blob = await binder.BindAsync<CloudBlockBlob>(attributesOrg);
blob.Delete();
}
Blob verschieben/umbenennen Die Kombination von Kopieren und Löschen ergibt den folgenden Code zum Verschieben/Umbenennen des Blobs:
{
"Bindungen": [
{
"Name": "Eingabe",
"Typ": "blobTrigger",
"Richtung": "in",
"Pfad": "test/{name}",
"Verbindung": ""
}
],
"deaktiviert": false
}
#r "Microsoft.WindowsAzure.Storage"
mit Microsoft.WindowsAzure.Storage.Blob;
public static async Task Run(string input, string name, Binder binder, TraceWriter log)
{
log.Info($"C# Blob-Trigger-Funktion verarbeitet: {name} ({input.Count()})");
//Blob kopieren
string path = $"testcontainer/{DateTime.UtcNow.ToString("yyyy/MM/dd/HH")}/"+name;
var attributes = new Attribut[]
{
new BlobAttribute(Pfad),
new StorageAccountAttribute("")
};
using (var writer = await binder.BindAsync<TextWriter>(Attribute))
{
writer.Write(input);
}
//Löschen Sie den Blob
var attributesOrg = new Attribut[]
{
new BlobAttribute($"test/{name}"),
new StorageAccountAttribute("")
};
var blob = await binder.BindAsync<CloudBlockBlob>(attributesOrg);
blob.Delete();
}
Im Beispielcode sind mehrere (Ausgabe-)Aktionen an den Binder gebunden.
Mehrere Blobs in Abhängigkeit vom eingehenden Blob erstellen Ein weiterer Anwendungsfall für den Imperativen Binder ist die Erstellung mehrerer Ausgabe-Blobs in Abhängigkeit vom eingehenden Blob. Sie können den Binder mehrfach aufrufen, um alle Blobs zu speichern. Als Beispiel erstelle ich für jede Zeile in der eingehenden Blob-Datei einen neuen Blob.
{
"Bindungen": [
{
"Name": "blob",
"Typ": "blobTrigger",
"Richtung": "in",
"Pfad": "test/{name}",
"Verbindung": ""
}
],
"deaktiviert": false
}
#r "Microsoft.WindowsAzure.Storage"
mit Microsoft.WindowsAzure.Storage.Blob;
public static async Task Run(string input, string name, Binder binder, TraceWriter log)
{
log.Info($"C# Blob-Trigger-Funktion verarbeitet: {name} ({input.Count()})");
int linecount = 0;
foreach (var line in input.Split('n')){
string path = $"testcontainer/lines/{linecount}/{name}";
log.Info($"Pfad: {path}");
var attributes = new Attribut[]
{
new BlobAttribute(Pfad),
new StorageAccountAttribute("")
};
using (var writer = await binder.BindAsync<TextWriter>(Attribute))
{
writer.Write(line);
}
Zeilenzahl++;
}
}
Fazit Mit dem erweiterten Binder können Sie Ausgaben machen, die auf Berechnungen in der Funktion selbst basieren. In diesem Beispiel werden die Blob-Bindungen verwendet. Das Gleiche ist für alle anderen Bindungsarten möglich:
| Bindung | Attribut | Referenz hinzufügen |
|---|---|---|
| DocumentDB | Microsoft.Azure.WebJobs.DocumentDBAttribute | #r "Microsoft.Azure.WebJobs.Extensions.DocumentDB" |
| Ereignis-Hubs | Microsoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute | #r "Microsoft.Azure.Jobs.ServiceBus" |
| Mobile Apps | Microsoft.Azure.WebJobs.MobileTableAttribute | #r "Microsoft.Azure.WebJobs.Extensions.MobileApps" |
| Notification Hubs | Microsoft.Azure.WebJobs.NotificationHubAttribute | #r "Microsoft.Azure.WebJobs.Extensions.NotificationHubs" |
| Service Bus | Microsoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute | #r "Microsoft.Azure.WebJobs.ServiceBus" |
| Speicherwarteschlange | Microsoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute | |
| Speicherblob | Microsoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute | |
| Aufbewahrungstisch | Microsoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute | |
| Twilio | Microsoft.Azure.WebJobs.TwilioSmsAttribute | #r "Microsoft.Azure.WebJobs.Extensions.Twilio" |
Wenn Sie die richtige Wahl zwischen einer imperativen oder deklarativen Bindung treffen, halten Sie den Code sauber. Dadurch bleibt der Funktionscode wartbar und zukunftssicher.
Verfasst von
Peter Groenewegen
Contact