Durch die Implementierung benutzerdefinierter Middleware in Azure Functions lassen sich Services zentralisieren und für alle Funktionen zugänglich machen. Aufgaben wie Logging, Exception Handling oder Authentifizierung können ausgelagert werden, wodurch der Code in den Funktionen selbst auf den spezifischen Zweck fokussiert und kompakter gestaltet werden kann.
Der Artikel beleuchtet die Voraussetzungen für Azure Functions Middleware, wirft einen Blick auf die .NET Roadmap und vergleicht den isolierten Worker-Prozess mit dem In-Process-Ansatz. Dabei wird anhand von Logging veranschaulicht, wie dies als Middleware in der Praxis umgesetzt werden kann.
Um die Vorteile eine Middleware in Azure Functions nutzen zu können, muss die Funktion im isolierten Worker-Prozess laufen. Dazu muss beim Erstellen des Projektes als „Functions worker“ „Isolated“ ausgewählt werden, alternativ können bestehende Projekte konvertiert werden.
Visual Studio bietet jeweils eigene Projekt-Templates für „Isolated worker process“ (Isolated) und „In-process“ (welcher nicht explizit genannt wird).
Die Roadmap von Microsoft geht dabei klar in Richtung Isolated worker. Das aktuelle Ziel ist es, vor dem .Net 8 Release (geplant 11/2023) für beide Modelle den gleichen Funktionsumfang bereit zu stellen.
.Net 8 LTS ist, zum jetzigen Zeitpunkt, als letzter Release für das In-process Modell geplant.
Die Einführung des Isolated worker process in .NET Functions ermöglicht eine Flexibilität, die im ursprünglichen stark integrierten In-process Modell nicht gegeben war. In dieser isolierten Umgebung können Funktionen auf aktuellen .NET-Versionen laufen, die von der Functions-Runtime nicht nativ unterstützt werden (einschließlich .NET Framework). Da die Funktionen in einem separaten Prozess ausgeführt werden, treten keine Konflikte mit verschiedenen Versionen derselben Assembly auf, die vom Hostprozess verwendet werden. Eine bessere Kontrolle über den Anwendungsstart, mehr Möglichkeiten der Konfigurationen und aktuelle Methoden für Dependency-Injection-auch von Middleware sind weitere Vorteile.
Ein Vergleich der von VS erzeugten Projektdateien zeigt den Unterschied der verwendeten Pakete.
Neu ist das Element „<OutputType>Exe</OutputType>“.
In der local.settings.json ist FUNCTIONS_WORKER_RUNTIME auf dotnet-isolated gesetzt.
Für die „in-process“ Function werden „FunctionName“ und „HttpTrigger“ aus dem Namespace „Microsoft.Azure.WebJobs“ verwendet, während bei der „Isolated worker process“ Function „Function“ und „HttpTrigger“ aus dem Namespace „Microsoft.Azure.Functions.Worker“ stammen.
Auf die Umstellung „IActionResult“ zu „HttpResponseData“ und „HttpRequest“ zu „HttpRequestData“ kann durch das Nachinstallieren vom Nuget Packet „Microsoft.AspNetCore.Mvc.Abstractions“ verzichtet werden.
Die Registrierung der benötigten Dienste für Dependency Injection wandert aus der Klasse „Startup“, die von „FunctionsStartup“ ableiten und „Configure“ implementieren muss, in die Klasse „Program“. Über die Funktion “ConfigureServices” von “IHostBuilder” werden die Dienste beim „Isolated worker process“ Modell registriert.
Darüber hinaus sind weitere Anpassungen möglich, da auf den gesamten HostBuilder der Funktion zugegriffen werden kann.
Eine eigene Middleware kann jetzt über die Methode „ConfigureFunctionsWorkerDefaults“ mit „applicationBuilder.UseMiddleware<MyMiddleware>();“ registriert werden. Die eigene Implementierung muss dabei „IFunctionsWorkerMiddleware“ implementieren.
Der Aufruf des delegates next, gibt die Ausführung dann an die nächste registrierte Middleware weiter und führt schließlich die aufgerufene Funktion aus.
Mit „applicationBuilder.UseWhen<MyMiddleware>“ sind zudem Filter auf die anzuwendende Middleware, z.B http-Trigger, zur Laufzeit realisierbar.
Quellen:
https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide
https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-in-process-differences
https://learn.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-in-process-differences
https://www.re-mark-able.net/blogs/2021/05/09/azure-functions-middleware.html
https://www.daveabrock.com/2021/02/24/functions-dotnet-5/
Die Tipp kommt von unserem Berliner Mitarbeiter Lutz Brandt.