Azure Functions unterstützt verschiedene Hosting-Modelle und Pläne, die jeweils unterschiedliche Anforderungen an Leistung, Skalierbarkeit und Kosten abdecken. Dabei ist das in-prozess Hosting-Modell besonders hervorzuheben: Es erlaubt die Verwendung der Long-Term-Support-(LTS-)Versionen von .NET und gewährleistet die beste Performance und Skalierbarkeit. Zum Beispiel setzt Azure Functions Version 3 auf .NET Core 3.1, während Version 4 .NET 6.0 benötigt, wenn das in-prozess Modell verwendet wird. Alternativ können isolierte Funktionen eingesetzt werden, die eine flexiblere Wahl der .NET-Version ermöglichen.
Nach dem erfolgreichen lokalen Testen müssen Azure Functions in einem passenden Azure-Hostingplan bereitgestellt werden. Es existieren drei Haupttypen von Hostingplänen: Consumption, Premium und Dedicated. Der Consumption-Plan entspricht dem klassischen Serverless-Ansatz mit dynamischer Skalierung und Abrechnung nur bei tatsächlicher Ausführung der Funktionen. Hier können Funktionen jedoch zeitlich begrenzt werden, um endlose Ausführungen zu verhindern. Im Gegensatz dazu bietet der Premium-Plan stets „warme“ Instanzen, die Kaltstarts vermeiden, erlaubt unbegrenzte Laufzeiten, elastische Skalierung und größere Instanzen bis zu vier CPU-Kernen. Die Kosten sind hier durch die zugewiesenen Kernsekunden und den Speicher geprägt, mit einem Mindestpreis, da immer mindestens eine Instanz aktiv sein muss. Der Dedicated-Plan nutzt Azure App Service Pläne (Basic, Standard, Premium, Isolated) und ist vor allem für Szenarien interessant, bei denen bereits App Service Pläne für andere Anwendungen wie ASP.NET Core, gRPC oder GraphQL bestehen. In diesem Fall können beliebig viele Azure Functions neben weiteren Webanwendungen auf derselben Infrastruktur laufen, wobei die Abrechnung ausschließlich für den App Service Plan erfolgt.
Besondere Vorsicht ist bei der Auswahl der App Service Pläne geboten, da Premium- und Dedicated-Pläne beide auf App Service basieren, jedoch unterschiedliche Skalierbarkeitsmerkmale besitzen. Ein Elastic Premium Plan (z.B. EP1) ist für den Premium-Plan notwendig, während ein Standardplan (z.B. P1V1) den Dedicated-Plan bedient, der keine elastische Skalierung bietet.
Azure Functions benötigt zudem ein Azure Storage Konto für diverse Binding- und Trigger-Mechanismen. Azure Files kann als Speicherort für Funktion-Codes im Consumption- oder Premium-Plan dienen. Azure Blob Storage wird für Zustandsspeicherungen und Funktionsschlüssel genutzt, während Azure Queue Storage für Fehler- und Wiederholungsmechanismen einiger Trigger zuständig ist. Durable Functions nutzen zusätzlich Table Storage für Task-Hubs. Für die lokale Entwicklung steht Azurite als Open-Source-Speicheremulator zur Verfügung, der plattformübergreifend auf Windows, Linux und macOS funktioniert und den älteren Azure Storage Emulator abgelöst hat.
Bezüglich Sicherheit und Zugriffskontrolle verfügen Azure Functions über drei Autorisierungsstufen: Anonym (kein API-Schlüssel erforderlich), Funktion (funktionsspezifischer Schlüssel) und Admin (Master-Schlüssel). Diese Schlüssel sind über das Azure-Portal zugänglich und steuern, wie externe Clients auf die Funktionen zugreifen können.
Die Integration von Dependency Injection (DI) in Azure Functions basiert auf den .NET-Standards, weist aber Besonderheiten je nach Hosting-Modell auf. DI wird implementiert, indem eine Klasse von FunctionsStartup abgeleitet wird, deren Configure-Methode die notwendigen Dienste registriert. Funktionen selbst werden üblicherweise als statische Methoden umgesetzt, jedoch erfordert DI instanzbasierte Klassen, sodass Funktionalitäten und Services instanziiert und verwaltet werden.
Die Azure Functions Core Tools bieten die Laufzeitumgebung und Vorlagen für die lokale Entwicklung unter Windows, macOS und Linux mit beliebigen Editoren. Visual Studio 2022 integriert diese Tools im Azure-Entwicklungs-Workload, während sie für andere Plattformen über npm, MSI oder Homebrew installiert werden können.
Das Erstellen eines Azure Functions-Projekts empfiehlt sich zunächst lokal, um Tests und Debugging effizient durchzuführen, bevor die Funktionen in die Cloud deployt werden. Visual Studio 2022 und Visual Studio Code bieten hierzu jeweils spezifische Workflows und Erweiterungen, wobei z.B. Azurite für lokalen Speicher genutzt und Authentifizierungslevel konfiguriert werden können. Für beide IDEs werden unterschiedliche Ordnerstrukturen und Projektvorlagen verwendet, um die Entwicklung zu optimieren.
Zusätzlich zur technischen Umsetzung ist es wichtig, die Implikationen des gewählten Hosting-Plans und der Storage-Abhängigkeiten ganzheitlich zu verstehen. Die Wahl zwischen Consumption-, Premium- oder Dedicated-Plänen hat nicht nur Auswirkungen auf Kosten und Skalierbarkeit, sondern auch auf Latenzzeiten, Kaltstarts und Verfügbarkeit. Die sichere Verwaltung von API-Schlüsseln ist essenziell, um unautorisierten Zugriff zu verhindern und die Integrität der Funktionen zu gewährleisten. Schließlich ermöglicht das Dependency Injection Framework eine klare Trennung von Anliegen und verbessert die Testbarkeit sowie Wartbarkeit komplexer Funktionalitäten.
Wie man Projekte und Dienste in .NET strukturiert und verwaltet
Beim Erstellen von Anwendungen und Diensten mit .NET ist es entscheidend, die Projekte strukturiert und organisiert zu benennen. Dies erleichtert nicht nur die Entwicklung, sondern auch die langfristige Wartung und Erweiterung der Software. Der folgende Abschnitt beleuchtet die Best Practices bei der Projektstruktur und der Handhabung von Portnummern sowie den Umgang mit Warnungen in .NET-Projekten.
Die Erstellung von Anwendungen, die auf C# und .NET basieren, verlangt ein gutes Verständnis der zugrunde liegenden Struktur und Konventionen. Während dieses Buches werden Sie lernen, wie man Code schreibt und ausführt, ohne sich sofort in den Details der zugrunde liegenden Technologien zu verlieren. Eine der ersten Herausforderungen, mit denen Sie konfrontiert werden, ist die Verwaltung vieler Projekte in einer Lösung. Besonders bei großen, komplexen Anwendungen, die mehrere Webseiten und Dienste umfassen, ist eine sinnvolle Projektstrukturierung unerlässlich. Ohne eine solche Struktur kann es schwierig werden, den Überblick zu behalten und effizient zu arbeiten.
Ein Beispiel für eine strukturierte Namensgebung und Organisation könnte das fiktive Unternehmen „Northwind“ sein, das in vielen Microsoft-Datenbankbeispielen verwendet wird. Um eine klare Trennung zwischen den verschiedenen Teilen einer Anwendung zu erreichen, wird in diesem Buch der Name „Northwind“ als Präfix für alle Projekte verwendet. Dies sorgt für Klarheit und erleichtert die Identifikation der einzelnen Projekte innerhalb einer Lösung.
Die Konventionen zur Projektbenennung sind vielfältig und können je nach Team oder individuellen Vorlieben variieren. Eine gängige Praxis ist es, die Art des Projekts im Namen zu integrieren, etwa „Northwind.WebApi.Service“ für einen HTTP-API-Service oder „Northwind.Mvc“ für eine ASP.NET-Core-Anwendung, die das Model-View-Controller-Muster verwendet. Diese Namensgebung hilft nicht nur dabei, den Zweck des Projekts sofort zu erkennen, sondern trägt auch zur Übersichtlichkeit bei.
Ein weiteres wichtiges Thema ist die Verwaltung von Portnummern. Wenn Sie mehrere Projekte gleichzeitig ausführen, etwa mehrere Webseiten und Web-APIs, müssen Sie sicherstellen, dass keine Portnummern doppelt belegt sind. Eine gängige Praxis ist es, eine eigene Portnummer für jedes Kapitel oder jede Anwendung zu definieren. Beispielsweise wird für das Beispiel aus Kapitel 15 (zum Thema „Building Web User Interfaces Using ASP.NET Core“) der Port 5151 verwendet, um Konflikte zu vermeiden.
Neben der Strukturierung von Projekten und der Zuweisung von Portnummern spielt auch der Umgang mit Compiler-Warnungen eine wichtige Rolle. In der Regel zeigt der Compiler Warnungen an, wenn potenzielle Probleme im Code erkannt werden. Diese Warnungen verhindern zwar nicht die Kompilierung, sollten jedoch nicht ignoriert werden. Wenn Sie Warnungen unbeachtet lassen, könnte das zu schlechten Entwicklungsmustern führen. Es ist daher ratsam, in den Projekteinstellungen die Option zu aktivieren, Warnungen als Fehler zu behandeln. Diese Einstellung zwingt den Entwickler, alle Warnungen zu beheben, bevor der Code erfolgreich kompiliert wird. Nur in Ausnahmefällen, wie bei der Arbeit mit gRPC-Diensten, sollten Warnungen als nicht kritisch betrachtet werden.
Die Behandlung von Warnungen als Fehler sorgt für eine höhere Codequalität und verhindert, dass potenzielle Probleme in die Produktionsumgebung gelangen. Dies ist besonders wichtig, wenn Sie in einem Team arbeiten, da es sicherstellt, dass jeder Entwickler dieselben Standards für die Codequalität befolgt.
Ein weiterer Aspekt, der beim Erstellen von Anwendungen mit .NET berücksichtigt werden sollte, ist die Wahl der richtigen Technologieplattform. Microsoft bietet eine Vielzahl von Technologien an, die speziell für die Entwicklung von Webanwendungen und -diensten konzipiert sind. Eine der bekanntesten ist ASP.NET Core, das sowohl für einfache Webseiten als auch für komplexe Webanwendungen verwendet werden kann. Webseiten, die mit ASP.NET Core erstellt werden, bestehen oft aus mehreren dynamisch generierten Seiten, die vom Server verarbeitet und an den Browser gesendet werden. Dies ermöglicht es, Daten auf dem Server zu speichern und bei Bedarf zu manipulieren, während der Client-Browser hauptsächlich als Präsentationsschicht fungiert.
Die Wahl der richtigen Webtechnologie hängt von den Anforderungen Ihres Projekts ab. Wenn Sie eine einfache, statische Webseite benötigen, können ASP.NET Core Razor Pages eine geeignete Lösung darstellen. Diese Technologie ermöglicht es, HTML-Seiten dynamisch zu generieren und in einer Webanwendung zu integrieren, ohne dass umfangreiche Client-Seitentechnologien wie JavaScript erforderlich sind.
Für komplexere Anwendungen, die interaktive Benutzeroberflächen oder APIs erfordern, sind Technologien wie ASP.NET Core MVC oder ASP.NET Core Web API besser geeignet. Diese bieten mehr Flexibilität und Kontrolle über die Art und Weise, wie Daten verarbeitet und zwischen Server und Client kommuniziert werden.
Abschließend lässt sich sagen, dass die Strukturierung Ihrer Projekte und die konsequente Anwendung von Best Practices bei der Verwaltung von Portnummern und Compiler-Warnungen wesentliche Schritte für den Erfolg Ihrer Softwareentwicklung mit .NET sind. Eine gut durchdachte Struktur erleichtert nicht nur die Zusammenarbeit im Team, sondern trägt auch dazu bei, dass Ihre Anwendungen effizient und fehlerfrei laufen.
Wie beeinflussen nicht-invasive Gehirnstimulationstechniken kognitive Funktionen und die Sprachtherapie bei Schlaganfallpatienten?
Wie konvergiert eine Folge von Funktionen punktweise und was bedeutet dies für eine Funktionsreihe?
Wie Polizisten mit Protesten umgehen sollten: Herausforderungen und Prinzipien in einer Demokratie

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский