Neuerungen in .NET.NET Aspire 9.0
📢 .NET Aspire 9.0 ist die nächste allgemeine Verfügbarkeitsfreigabe (GA) von .NET Aspire; es unterstützt beide:
- .NET 8.0 Langzeitunterstützung (LTS) oder
- .NET 9.0 Standard Term Support (STS).
Anmerkung
Sie können .NET Aspire 9.0 entweder mit .NET 8 oder .NET 9 verwenden!
In dieser Version werden einige der am häufigsten angeforderten Features und Schmerzpunkte der Community behandelt. Die besten Features sind communitygesteuert! Um der Community beizutreten, besuchen Sie uns auf Discord, um mit Teammitgliedern zu chatten und mit uns an GitHubzusammenzuarbeiten.
Weitere Informationen zur offiziellen .NET-Version und zur .NET Aspire-Versionsunterstützung finden Sie unter:
- .NET Unterstützungsrichtlinie: Definitionen für LTS und STS.
- .NET .NET Aspire Supportrichtlinie: Wichtige einzigartige Produktlebenszyklus-Details.
Upgrade auf .NET.NET Aspire 9
Um von früheren Versionen von .NET Aspire auf .NET Aspire 9 zu aktualisieren, befolgen Sie die Anweisungen im offiziellen Upgrade auf .NET.NET Aspire 9 Handbuch. Das Handbuch enthält detaillierte Anweisungen für das Upgrade Ihrer vorhandenen .NET Aspire Lösungen auf .NET Aspire 9. Unabhängig davon, ob Sie es manuell durchführen oder den Upgrade-Assistenten verwenden, vereinfacht der Leitfaden den Prozess erheblich.
Werkzeugverbesserungen
.NET Aspire 9 vereinfacht die Konfiguration Ihrer Umgebung, um .NET Aspire Anwendungen zu entwickeln. Sie benötigen keine .NET-Arbeitslast mehr. Stattdessen installieren Sie das neue .NET.NET Aspire SDK in das App-Hostprojekt Ihrer .NET.NET Aspire-Lösungen. Weitere Informationen finden Sie unter .NET.NET Aspire Einrichtung und Tools.
Vorlagen wurden verschoben
.NET
.NET Aspire 9 verschiebt den Inhalt, der früher über die Workload installiert wurde, in separate NuGet-Pakete. Dazu gehören die Vorlagen zum Erstellen neuer .NET.NET Aspire Projekte und Lösungen. Diese Vorlagen werden mithilfe des befehls dotnet new install
installiert. Diese können installiert werden, indem Sie den folgenden Befehl ausführen:
dotnet new install Aspire.ProjectTemplates::9.0.0
Trinkgeld
Wenn Sie die .NET.NET Aspire Workload bereits installiert haben, müssen Sie das --force
Flag übergeben, um die vorhandenen Vorlagen zu überschreiben. Sie können die Workload .NET.NET Aspire bedenkenlos deinstallieren.
Weitere Informationen finden Sie unter .NET.NET Aspire Vorlagen.
Verbesserungen der Dashboard-Benutzeroberfläche und neue Interaktivitätsfeatures
Das .NET.NET Aspire Dashboard wird mit jeder Version weiter verbessert.
Verwalten des Ressourcenlebenszyklus
Die am häufigsten angeforderte Funktion für das Dashboard besteht darin, die Lebenszyklen Ihrer orchestrierten benannten Ressourcen zu verwalten. Insbesondere die Möglichkeit, Ressourcen zu stoppen, zu starten und neu zu starten. Dieses Feature funktioniert für Projekte, Container und ausführbare Dateien. Sie ermöglicht den Neustart einzelner Ressourcen, ohne den gesamten App-Host neu starten zu müssen. Bei Projektressourcen wird der Debugger beim Neustart erneut angefügt. Weitere Informationen finden Sie unter .NET.NET Aspire Dashboard: Beenden oder Starten einer Ressource.
Mobile und reaktionsfähige Unterstützung
Das .NET Aspire-Dashboard ist jetzt mobilfreundlich, reaktionsfähig und passt sich an eine Vielzahl von Bildschirmgrößen an und ermöglicht die on-the-go-Verwaltung der bereitgestellten .NET Aspire-Anwendungen. Weitere Verbesserungen bei der Barrierefreiheit wurden vorgenommen, einschließlich der Anzeige von Einstellungen und dem Überlauf von Inhalten auf mobilen Geräten.
Sensible Eigenschaften, Volumes und Integritätsprüfungen in Ressourcendetails
Die Anzeige von Ressourcendetails enthält mehrere Verbesserungen:
Eigenschaften können als vertraulich markiert und automatisch in der Dashboard-Benutzeroberfläche maskiert werden. Mit dieser Sicherheitsfunktion können Sie verhindern, dass beim Freigeben des Dashboards an andere Personen versehentlich Schlüssel oder Kennwörter offengelegt werden. Containerargumente könnten beispielsweise vertrauliche Informationen übergeben und sind standardmäßig maskiert.
Konfigurierte Containervolumen werden in den Ressourcendetails aufgeführt.
.NET .NET Aspire 9 fügt Unterstützung für Integritätsprüfungen hinzu. Detaillierte Informationen zu diesen Prüfungen können nun im Bereich "Ressourcendetails" angezeigt werden, der zeigt, warum eine Ressource möglicherweise als fehlerhaft oder herabgestuft markiert wird. Erfahren Sie mehr über Gesundheitschecks hier.
Farbiges Konsolen-Log
ANSI-Escapecodes Text in Terminals formatieren, indem Farben (Vordergrund und Hintergrund) und Formatvorlagen wie Fett, Unterstrichen und Kursiv gesteuert werden. Zuvor konnte die Konsolenprotokollseite des Dashboards nur jeweils einen ANSI-Escapecode rendern, und sie schlug fehl, wenn mehrere Codes kombiniert wurden. So könnte z. B. roter Text angezeigt werden, aber kein Text, der sowohl rot als auch fett war.
Ein Communitybeitrag von @mangeg verbesserte die Unterstützung von ANSI-Escapecodes und beseitigte diese Einschränkung.
Eine weitere Verbesserung der Konsolenprotokolle besteht darin, nicht unterstützte Escapecodes auszublenden. Codes, die sich nicht auf die Anzeige von Text beziehen, z. B. das Positionieren des Cursors oder die Kommunikation mit dem Betriebssystem sind in dieser Benutzeroberfläche nicht sinnvoll und werden ausgeblendet.
Benutzerorientierte Telemetrie-Ergänzungen
Telemetrie bleibt ein wichtiger Aspekt der .NET.NET Aspire. In .NET.NET Aspire 9 wurden viele neue Features für den Telemetriedienst eingeführt.
Verbesserte Telemetriefilterung
Spuren können mit Attributwerten gefiltert werden. Wenn Sie beispielsweise nur Ablaufverfolgungen für einen Endpunkt in Ihrer App anzeigen möchten, kann das Attribut http.route
für HTTP-Anforderungen auf einen angegebenen Wert gefiltert werden.
Die Telemetriefilterung unterstützt auch die Autovervollständigung vorhandener Werte. Das Dialogfeld Filter hinzufügen bietet ein Kombinationsfeld zum Auswählen aus Werten, die im Dashboard verfügbar sind. Dieses Feature erleichtert das Filtern nach echten Daten und hilft dabei, Tippfehler zu vermeiden, indem Sie selbst einen Wert eingeben.
Weitere Informationen finden Sie im .NET.NET Aspire-Dashboard: Ablauffilter.
Kombinieren Sie Telemetriedaten aus mehreren Quellen
Wenn eine Ressource über mehrere Replikate verfügt, können Sie jetzt Telemetrie filtern, um Daten aus allen Instanzen gleichzeitig anzuzeigen. Wählen Sie die übergeordnete Ressource aus, die als (application)
bezeichnet wird. Weitere Informationen finden Sie unter .NET.NET Aspire dashboard: Kombinieren von Telemetrie aus verschiedenen Ressourcen.
Browser-Telemetrieunterstützung
Das Dashboard unterstützt das OpenTelemetry-Protokoll (OTLP) über HTTP und Cross-Origin Resource Sharing (CORS). Diese Features entsperren die Möglichkeit, OpenTelemetry von Browser-Apps an das .NET Aspire-Dashboard zu senden.
Beispielsweise kann eine browserbasierte Einzelseiten-App (SPA) das JavaScript-OpenTelemetry SDK- so konfigurieren, dass strukturierte Protokolle, Ablaufverfolgungen und Metriken, die im Browser erstellt wurden, an das Dashboard gesendet werden. Die Browsertelemetrie wird zusammen mit der server-Telemetrie angezeigt.
Weitere Informationen zum Konfigurieren der Browsertelemetrie finden Sie in Aktivieren von Browsertelemetrie Dokumentation.
App-Host (Orchestrierung)
Die .NET.NET Aspire App-Host- ist eine der wichtigsten Funktionen von .NET.NET Aspire. In .NET.NET Aspire 9 wurden dem App-Host verschiedene neue Features hinzugefügt.
Warten auf Abhängigkeiten
Wenn Sie .NET.NET Aspireverfolgt haben, wissen Sie bereits, dass Ihr App-Hostprojekt der Ort ist, wo Sie Ihr App-Modell definieren. Sie erstellen einen verteilten Anwendungs-Generator, fügen Ressourcen hinzu und konfigurieren ressourcen und geben deren Abhängigkeiten an. Jetzt können Sie angeben, dass eine Ressource vor dem Start auf eine andere Ressource warten soll. Dies kann Verbindungsfehler beim Start vermeiden, indem Ressourcen erst dann gestartet werden, wenn ihre Abhängigkeiten "bereit" sind.
var builder = DistributedApplication.CreateBuilder(args);
var rabbit = builder.AddRabbitMQ("rabbit");
builder.AddProject<Projects.WebApplication1>("api")
.WithReference(rabbit)
.WaitFor(rabbit); // Don't start "api" until "rabbit" is ready...
builder.Build().Run();
Wenn der App-Host startet, wartet er, bis die rabbit
-Ressource bereit ist, bevor die api
-Ressource startet.
Es gibt zwei Methoden, die verfügbar gemacht werden, um auf eine Ressource zu warten:
- WaitFor: Warten Sie, bis eine Ressource bereit ist, bevor Sie eine andere Ressource starten.
- WaitForCompletion: Warten Sie, bis eine Ressource abgeschlossen ist, bevor Sie eine andere Ressource starten.
Weitere Informationen finden Sie unter .NET.NET Aspire App-Host: Warten auf Ressourcen.
Ressourcengesundheitschecks
Die WaitFor
-API führt standardmäßige .NET Integritätsprüfungen durch, um festzustellen, ob eine Ressource bereit ist. Was bedeutet aber "eine Ressource ist bereit"? Das Beste daran ist, dass der Verbrauchende über die Standardwerte hinaus konfigurieren kann.
Wenn eine Ressource keine Integritätsprüfungen verfügbar macht (keine Integritätsprüfungen in der App registriert sind), wartet der App-Host, bis die Ressource sich im Zustand Running befindet, bevor die abhängige Ressource gestartet wird.
Für Ressourcen, die HTTP-Endpunkte verfügbar machen, können Sie ganz einfach eine Integritätsprüfung hinzufügen, die einen bestimmten Pfad für eine HTTP 200-Antwort abruft.
var builder = DistributedApplication.CreateBuilder(args);
var catalogApi = builder.AddContainer("catalog-api", "catalog-api")
.WithHttpEndpoint(targetPort: 8080)
.WithHttpHealthCheck("/health");
builder.AddProject<Projects.WebApplication1>("store")
.WithReference(catalogApi.GetEndpoint("http"))
.WaitFor(catalogApi);
builder.Build().Run();
Im vorherigen Beispiel wird der catalog-api
Ressource eine Integritätsprüfung hinzugefügt. Der App-Host wartet darauf, dass der Gesundheitscheck einen fehlerfreien Status meldet, bevor die Ressource store
gestartet wird. Sie bestimmt, dass die Ressource bereit ist, wenn der /health
-Endpunkt einen HTTP 200-Statuscode zurückgibt.
Während store
darauf wartet, dass catalog-api
gesund wird, werden die Ressourcen im Dashboard wie folgt angezeigt:
Der Integritätsprüfungsmechanismus des App-Hosts basiert auf der IHealthChecksBuilder-Implementierung aus dem Microsoft.Extensions.Diagnostics.HealthChecks-Namespace.
Gesundheitsprüfdaten, die im Dashboard angezeigt werden:
Das Erstellen einer benutzerdefinierten Gesundheitsprüfung ist unkompliziert. Definieren Sie zunächst die Integritätsprüfung und ordnen Sie dann ihren Namen den Ressourcen zu, auf die sie zutrifft.
var builder = DistributedApplication.CreateBuilder(args);
var healthyAfter = DateTime.Now.AddSeconds(20);
builder.Services.AddHealthChecks().AddCheck(
"delay20secs",
() => DateTime.Now > healthyAfter
? HealthCheckResult.Healthy()
: HealthCheckResult.Unhealthy()
);
var cache = builder.AddRedis("cache")
.WithHealthCheck("delay20secs");
builder.AddProject<Projects.MyApp>("myapp")
.WithReference(cache)
.WaitFor(cache);
Im vorangehenden Beispiel wird der Ressource cache
eine Integritätsprüfung hinzugefügt, die sie jeweils für die ersten 20 Sekunden nach dem Start des Anwendungshosts als fehlerhaft meldet. Die myapp
-Ressource wartet also 20 Sekunden vor dem Start, um sicherzustellen, dass die cache
-Ressource fehlerfrei ist.
Die Methoden AddCheck und WithHealthCheck bieten einen einfachen Mechanismus, um Gesundheitsprüfungen zu erstellen und sie bestimmten Ressourcen zuzuordnen.
Persistente Container
Der App-Host unterstützt jetzt persistente Container. Persistente Container weichen vom typischen Lebenszyklus von .NET.NET Aspire koordinierten Appsab. Während sie erstellt und (sofern nicht bereits verfügbar) vom .NET Aspire Orchestrator gestartet wurden, werden sie nicht durch .NET Aspirezerstört.
Dies ist nützlich, wenn Sie den Container auch weiterlaufen lassen möchten, nachdem der App-Host gestoppt wurde.
Wichtig
Um diese Container zu löschen, müssen Sie sie manuell mit der Containerlaufzeit beenden.
Um eine IResourceBuilder<ContainerResource>
mit einer persistenten Lebensdauer zu definieren, rufen Sie die WithLifetime-Methode auf und übergeben Sie ContainerLifetime.Persistent:
var builder = DistributedApplication.CreateBuilder(args);
var queue = builder.AddRabbitMQ("rabbit")
.WithLifetime(ContainerLifetime.Persistent);
builder.AddProject<Projects.WebApplication1>("api")
.WithReference(queue)
.WaitFor(queue);
builder.Build().Run();
Das Dashboard zeigt die persistenten Container mit einem Stecknadel-Symbol an.
Nachdem der App-Host beendet wurde, läuft der Container weiterhin.
Der Containerpersistenzmechanismus versucht zu identifizieren, wann Sie den Container möglicherweise neu erstellen möchten. Wenn sich beispielsweise die Umgebung für den Container ändert, wird der Container neu gestartet, sodass Sie den Container nicht manuell beenden müssen, wenn sich die Eingabekonfiguration für die Ressource geändert hat.
Ressourcenbefehle
Der App-Host unterstützt das Hinzufügen benutzerdefinierter Befehle zu Ressourcen. Dies ist nützlich, wenn Sie benutzerdefinierte Funktionen hinzufügen möchten, die vom App-Host nicht nativ unterstützt werden. Es gibt wahrscheinlich viele Möglichkeiten, wo das Verfügbarmachen von benutzerdefinierten Erweiterungsmethoden für Ressourcen nützlich sein wird. Das .NET.NET Aspire Community Toolkit ist möglicherweise eine gute Plattform, um diese Erweiterungen zu teilen.
Wenn Sie einen benutzerdefinierten Befehl definieren, ist er im Dashboard als Benutzererfahrungsfeature verfügbar.
Wichtig
Diese .NET.NET Aspire Dashboardbefehle sind nur verfügbar, wenn das Dashboard lokal ausgeführt wird. Sie sind nicht verfügbar, wenn Sie das Dashboard in Azure Container Appsausführen.
Weitere Informationen zum Erstellen benutzerdefinierter Ressourcenbefehle finden Sie unter How-to: Create custom resource commands in .NET.NET Aspire.
Containernetzwerke
Der App-Host fügt jetzt alle Container zu einem gemeinsamen Netzwerk mit dem Namen default-aspire-network
hinzu. Dies ist nützlich, wenn Sie zwischen Containern kommunizieren möchten, ohne das Hostnetzwerk zu durchlaufen. Dies erleichtert auch die Migration von docker Compose zum App-Host, da Container mithilfe des Containernamens miteinander kommunizieren können.
Ereignismodell
Mit dem Ereignismodell können Entwickler in den Lebenszyklus der Anwendung und der Ressourcen eingreifen. Dies ist nützlich, um benutzerdefinierten Code an bestimmten Stellen im Anwendungslebenszyklus auszuführen. Es gibt verschiedene Möglichkeiten, Ereignisse zu abonnieren, einschließlich globaler Ereignisse und Ereignisse pro Ressource.
Globale Ereignisse:
- BeforeStartEvent: Ein Ereignis, das vor dem Starten der Anwendung ausgelöst wird. Dies ist der letzte Ort, an dem Änderungen am App-Modell beobachtet werden. Dies läuft sowohl im Modus "Ausführen" als auch im Modus "Veröffentlichen". Dies ist ein Blockierungsereignis, was bedeutet, dass die Anwendung nicht startet, bis alle Handler ihre Arbeit abgeschlossen haben.
- AfterResourcesCreatedEvent: Ein Ereignis, das ausgelöst wird, nachdem die Ressourcen erstellt wurden. Dies läuft nur im Ausführungsmodus.
- AfterEndpointsAllocatedEvent: Ein Ereignis, das ausgelöst wird, nachdem die Endpunkte für alle Ressourcen zugewiesen wurden. Dies läuft nur im Ausführungsmodus.
Die globalen Ereignisse sind analog zu den App-Hostlebenszyklusereignissen. Weitere Informationen finden Sie unter App-Hostlebenszyklen.
Ereignisse pro Ressource:
- BeforeResourceStartedEvent: Ein Ereignis, das vor dem Start einer einzelnen Ressource ausgelöst wird. Dies läuft nur im Ausführungsmodus. Dies ist ein Blockierungsereignis, was bedeutet, dass die Ressource erst gestartet wird, wenn alle Handler abgeschlossen sind.
- ConnectionStringAvailableEvent: Ein Ereignis, das ausgelöst wird, wenn eine Verbindungszeichenfolge für eine Ressource verfügbar ist. Dies läuft nur im Run-Modus.
- ResourceReadyEvent: Ein Ereignis, das ausgelöst wird, wenn eine Ressource bereit zur Nutzung ist. Dies funktioniert nur im Ausführungsmodus.
Weitere Informationen finden Sie unter Eventing in .NET.NET Aspire.
Integrationen
.NET .NET Aspire fügt weiterhin Integrationen hinzu, die die ersten Schritte mit Ihren bevorzugten Diensten und Tools erleichtern. Weitere Informationen finden Sie unter .NET.NET Aspire Integrationsübersicht.
Redis Erkenntnis
Unterstützung für Redis Insights steht in einer Redis Ressource zur Verfügung:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddRedis("redis")
.WithRedisInsight(); // Starts a Redis Insight container image
// that is pre-configured to work with the
// Redis instance.
Die WithRedisInsight-Erweiterungsmethode kann auf mehrere Redis-Ressourcen angewendet werden, und jede von ihnen ist im Redis Insight-Dashboard sichtbar.
Weitere Informationen finden Sie unter Hinzufügen Redis Ressource mit Redis Insights.
OpenAI (Vorschau)
Ab .NET Aspire 9 ist eine zusätzliche OpenAI Integration verfügbar, mit der die neueste offizielle OpenAI dotnet-Bibliothek direkt verwendet werden kann. Die client-Integration registriert den OpenAIClient als Singletondienst in der Dienstauflistung. Die client kann für die Interaktion mit der OpenAIREST-API verwendet werden.
Darüber hinaus wurde die bereits verfügbare .NET AspireAzureOpenAI Integration verbessert, um eine flexible Möglichkeit zum Konfigurieren eines OpenAIClient
für einen Azure AI OpenAI-Dienst oder eine dedizierte OpenAIREST-API mit der neuen AddOpenAIClientFromConfiguration(IHostApplicationBuilder, String) Builder-Methode bereitzustellen. Im folgenden Beispiel wird erkannt, ob die Verbindungszeichenfolge für einen AzureAzure AI OpenAI Dienst ist und die am besten geeignete OpenAIClient
Instanz automatisch registriert.
builder.AddOpenAIClientFromConfiguration("openai");
Wenn die openai
-Verbindung z. B. wie Endpoint=https://{account}.azure.com;Key={key};
aussähe, würde es vermuten, eine Azure AI OpenAIclient wegen des Domänennamens registrieren zu können. Andernfalls wird ein gängiger OpenAIClient
verwendet.
Weitere Informationen finden Sie unter Azure-agnostische client Auflösung.
MongoDB
Unterstützung für die Angabe des MongoDB Benutzernamens und Kennworts bei Verwendung der AddMongoDB(IDistributedApplicationBuilder, String, Nullable<Int32>, IResourceBuilder<ParameterResource>, IResourceBuilder<ParameterResource>) Erweiterungsmethode hinzugefügt. Wenn nicht angegeben, wird ein zufälliger Benutzername und ein Kennwort generiert, kann jedoch manuell mithilfe von Parameterressourcen angegeben werden.
var builder = DistributedApplication.CreateBuilder(args);
var username = builder.AddParameter("mongousername");
var password = builder.AddParameter("mongopassword", secret: true);
var db = builder.AddMongo("db", username, password);
Wichtige Azure Verbesserungen
In den folgenden Abschnitten werden Azure Verbesserungen beschrieben, die in .NET Aspire 9 hinzugefügt wurden. Eine vollständige Auflistung aller änderungen finden Sie unter Breaking changes in .NET.NET Aspire 9.
Azure Ressourcenindividualisierung
In .NET Aspire 8 wurde die Anpassung von Azure Ressourcen als experimentell eingestuft, da die zugrunde liegenden Azure.Provisioning
Bibliotheken neu waren, um Feedback zu sammeln, bevor sie als stabil gekennzeichnet werden konnten. In .NET.NET Aspire 9 wurden diese APIs aktualisiert und die experimentellen Attribute entfernt.
Azure Änderung bei der Benennung von Ressourcen
Im Rahmen der Aktualisierung der Azure.Provisioning-Bibliotheken wurde das Standardbenennungsschema für Azure Ressourcen mit besserer Unterstützung für verschiedene Benennungsrichtlinien aktualisiert. Dieses Update führte jedoch zu einer Änderung der Art und Weise, wie Ressourcen benannt werden. Die neue Namensrichtlinie kann dazu führen, dass die vorhandenen Azure Ressourcen aufgegeben und neue Azure Ressourcen erstellt werden, nachdem Sie Ihre .NET Aspire-Anwendung von Version 8 auf Version 9 aktualisiert haben. Um dieselben Benennungsrichtlinien von .NET.NET Aspire 8 beizubehalten, können Sie den folgenden Code zu Ihrem AppHost Program.cshinzufügen:
var builder = DistributedApplication.CreateBuilder(args);
builder.Services.Configure<AzureProvisioningOptions>(options =>
{
options.ProvisioningBuildOptions.InfrastructureResolvers.Insert(0, new AspireV8ResourceNamePropertyResolver());
});
Azure SQL, PostgreSQLund Redis Update
Azure SQL, PostgreSQLund Redis Ressourcen unterscheiden sich von anderen Azure Ressourcen, da es lokale Containerressourcen für diese Technologien gibt. In .NET Aspire 8 mussten Sie, um diese Azure Ressourcen zu erstellen, mit einer lokalen Containerressource starten und sie anschließend entweder als "As" oder mit "PublishAs" in eine Azure Ressource umwandeln. Dieses Design führte zu Problemen und passte nicht zu anderen APIs.
Beispielsweise können Sie diesen Code in .NET.NET Aspire 8 haben:
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddSqlServer("sql")
.PublishAsAzureSqlDatabase();
var pgsql = builder.AddPostgres("pgsql")
.PublishAsAzurePostgresFlexibleServer();
var cache = builder.AddRedis("cache")
.PublishAsAzureSqlDatabase();
In .NET.NET Aspire 9 wurden diese APIs als veraltet markiert und ein neues API-Muster implementiert:
var builder = DistributedApplication.CreateBuilder(args);
var sql = builder.AddAzureSqlServer("sql")
.RunAsContainer();
var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
.RunAsContainer();
var cache = builder.AddAzureRedis("cache")
.RunAsContainer();
Microsoft Entra ID von Haus aus
Um .NET Aspire Anwendungen sicherer zu machen, wurde die Azure Datenbank für PostgreSQL und Azure Cache for Redis Ressourcen aktualisiert, um die Microsoft Entra ID standardmäßig zu verwenden. Dies erfordert Änderungen an Anwendungen, die eine Verbindung mit diesen Ressourcen herstellen müssen. Siehe Folgendes, um Anwendungen zu aktualisieren, damit sie Microsoft Entra ID verwenden, um eine Verbindung mit diesen Ressourcen herzustellen:
Die folgenden Beispiele veranschaulichen, wie Sie Ihre Anwendung so konfigurieren, dass eine Verbindung mit den Azure-Ressourcen mithilfe der Microsoft Entra-ID hergestellt wird:
Wenn Sie die Kennwort- oder Zugriffstastenauthentifizierung verwenden müssen (nicht empfohlen), können Sie sich mit dem folgenden Code anmelden:
var builder = DistributedApplication.CreateBuilder(args);
var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
.WithPasswordAuthentication();
var cache = builder.AddAzureRedis("cache")
.WithAccessKeyAuthentication();
Unterstützung für Azure-Funktionen (Vorschau)
Die Unterstützung für Azure Funktionen ist eine der am häufigsten angeforderten Funktionen im .NET.NET Aspire Issue-Tracker, und wir freuen uns, in dieser Version Unterstützung in der Vorschauversion einzuführen. Um diese Unterstützung zu veranschaulichen, verwenden wir .NET.NET Aspire zum Erstellen und Bereitstellen eines Webhooks.
Um zu beginnen, erstellen Sie ein neues Azure Functions-Projekt mithilfe des Dialogfelds Visual Studio Neues Projekt. Wenn Sie dazu aufgefordert werden, aktivieren Sie beim Erstellen des Projekts das Kontrollkästchen Teilnehmen an der Aspire Orchestrierung.
Im App-Hostprojekt beachten Sie, dass es ein PackageReference
zu dem neuen 📦Aspire.Hosting.Azure.Funktionen NuGet-Paket gibt.
<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
<PackageReference Include="Aspire.Hosting.Azure.Functions" Version="9.0.0" />
</ItemGroup>
Dieses Paket stellt eine AddAzureFunctionsProject<TProject>(IDistributedApplicationBuilder, String)-API bereit, die im App-Host aufgerufen werden kann, um Azure Funktionen-Projekte innerhalb eines .NET Aspire-Hosts zu konfigurieren.
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp");
builder.Build().Run();
In diesem Beispiel ist der Webhook für die Übersetzung einer Eingabezeichenfolge in Pig Latin verantwortlich. Aktualisieren Sie den Inhalt unseres Triggers mit dem folgenden Code:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
using System.Text;
using FromBodyAttribute = Microsoft.Azure.Functions.Worker.Http.FromBodyAttribute;
namespace PigLatinApp;
public class Function1(ILogger<Function1> logger)
{
public record InputText(string Value);
public record PigLatinText(string Value);
[Function("Function1")]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
[FromBody] InputText inputText)
{
logger.LogInformation("C# HTTP trigger function processed a request.");
var result = TranslateToPigLatin(inputText.Value);
return new OkObjectResult(new PigLatinText(result));
}
private static string TranslateToPigLatin(string input)
{
if (string.IsNullOrEmpty(input))
{
return input;
}
var words = input.Split(' ');
StringBuilder pigLatin = new();
foreach (string word in words)
{
if (IsVowel(word[0]))
{
pigLatin.Append(word + "yay ");
}
else
{
int vowelIndex = FindFirstVowelIndex(word);
if (vowelIndex is -1)
{
pigLatin.Append(word + "ay ");
}
else
{
pigLatin.Append(
word.Substring(vowelIndex) + word.Substring(0, vowelIndex) + "ay ");
}
}
}
return pigLatin.ToString().Trim();
}
private static int FindFirstVowelIndex(string word)
{
for (var i = 0; i < word.Length; i++)
{
if (IsVowel(word[i]))
{
return i;
}
}
return -1;
}
private static bool IsVowel(char c) =>
char.ToLower(c) is 'a' or 'e' or 'i' or 'o' or 'u';
}
Legen Sie einen Haltepunkt in der ersten logger.LogInformation
Zeile der Run
-Methode fest, und drücken Sie F5-, um den Funktionenhost zu starten. Sobald das .NET.NET Aspire-Dashboard gestartet wird, beobachten Sie Folgendes:
.NET .NET Aspire hat:
- Konfiguriert eine emulierte Azure Speicherressource, die für die Buchführung durch den Host verwendet werden soll.
- Der Funktionshost wurde lokal gestartet, wobei das Ziel auf das registrierte Functions-Projekt festgelegt wurde.
- Verkabelt den in launchSettings definierten Port.json des Funktionsprojekts zum Zuhören.
Verwenden Sie Ihre beliebige HTTP-client, um eine Anforderung an den Trigger zu senden und beobachten Sie die aus dem Anforderungskörper im Debugger gebundenen Eingaben.
curl --request POST \
--url http://localhost:7282/api/Function1 \
--header 'Content-Type: application/json' \
--data '{
"value": "Welcome to Azure Functions"
}'
Jetzt können Sie unsere Anwendung für Azure Container Apps (ACA) bereitstellen. Die Bereitstellung hängt derzeit von den Vorschaubuilds der Azure Functions Worker und Worker SDK-Pakete ab. Aktualisieren Sie bei Bedarf die Versionen, auf die im Funktionsprojekt verwiesen wird:
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.0.0-preview2" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.0-preview2" />
</ItemGroup>
Sie müssen auch einen öffentlichen Endpunkt für unser Azure Functions-Projekt verfügbar machen, und dafür sorgen, dass Anfragen an unseren HTTP-Trigger gesendet werden können.
builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp")
.WithExternalHttpEndpoints();
Um die Anwendung mit der azd
CLIbereitzustellen, müssen Sie zuerst die neueste Version abrufen. Wenn Sie die neueste Version installieren möchten, wird eine Warnung angezeigt, wenn Ihre Version veraltet ist. Folgen Sie den Anweisungen, um auf die neueste Version zu aktualisieren.
Navigieren Sie nach der Installation zum Ordner mit dem App-Hostprojekt, und führen Sie azd init
aus:
$ azd init
Initializing an app to run on Azure (azd init)
? How do you want to initialize your app? Use code in the current directory
(✓) Done: Scanning app code in current directory
Detected services:
.NET (Aspire)
Detected in: ./PigLatinApp/PigLatinApp.AppHost/PigLatinApp.AppHost.csproj
azd will generate the files necessary to host your app on Azure using Azure Container Apps.
? Select an option Confirm and continue initializing my app
? Enter a new environment name: azfunc-piglatin
Generating files to run your app on Azure:
(✓) Done: Generating ./azure.yaml
(✓) Done: Generating ./next-steps.md
SUCCESS: Your app is ready for the cloud!
Stellen Sie dann die Anwendung bereit, indem Sie azd up
ausführen:
$ azd up
? Select an Azure Subscription to use: 130. [redacted]
? Select an Azure location to use: 50. (US) West US 2 (westus2)
Packaging services (azd package)
Provisioning Azure resources (azd provision)
Provisioning Azure resources can take some time.
Subscription: [redacted]
Location: West US 2
You can view detailed progress in the Azure Portal:
[redacted]
(✓) Done: Resource group: rg-azfunc-piglatin (967ms)
(✓) Done: Container Registry: [redacted] (13.316s)
(✓) Done: Log Analytics workspace: [redacted] (16.467s)
(✓) Done: Container Apps Environment: [redacted] (1m35.531s)
(✓) Done: Storage account: [redacted] (21.37s)
Deploying services (azd deploy)
(✓) Done: Deploying service piglatinapp
- Endpoint: {{endpoint-url}}
Aspire Dashboard: {{dashboard-url}}
Testen Sie schließlich die bereitgestellte Funktionenanwendung mit Ihrem bevorzugten HTTP-client.
curl --request POST \
--url {{endpoint-url}}/api/Function1 \
--header 'Content-Type: application/json' \
--data '{
"value": "Welcome to Azure Functions"
}'
Die Unterstützung für Azure-Funktionen in .NET Aspire befindet sich weiterhin in der Vorschau, unterstützt jedoch nur einen begrenzten Satz von Triggern, einschließlich:
- HTTP-Trigger
- Azure Speicherwarteschlangen-Trigger
- Azure Storage-Blob-Auslöser
- Azure Service Bus Auslöser
- Azure Event Hubs löst aus
Weitere Informationen finden Sie in der offiziellen .NET AspireAzure Funktionsintegration (Vorschau).
Anpassung von Azure Container Apps
Eines der am häufigsten angeforderten Features ist die Möglichkeit, die Azure Container Apps anzupassen, die der App-Host erstellt, ohne Bicep zu berühren. Dies ist möglich, indem sie die PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>)- und PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>)-APIs im Aspire.Hosting.Azure.AppContainers
-Namespace verwenden. Diese Methoden passen die Azure Container-App-Definition an, die der App-Host erstellt.
Fügen Sie der Projektdatei den Paketverweis hinzu:
<ItemGroup>
<PackageReference Include="Aspire.Hosting.Azure.AppContainers"
Version="9.0.0" />
</ItemGroup>
Im folgenden Beispiel wird veranschaulicht, wie eine Azure Container-App auf Null (0
) Replikate skaliert wird:
var builder = DistributedApplication.CreateBuilder(args);
var db = builder.AddAzurePostgresFlexibleServer("pg")
.RunAsContainer()
.AddDatabase("db");
// Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
#pragma warning disable AZPROVISION001
builder.AddProject<Projects.WebApplication1>("api")
.WithReference(db)
.PublishAsAzureContainerApp((module, containerApp) =>
{
// Scale to 0
containerApp.Template.Value!.Scale.Value!.MinReplicas = 0;
});
#pragma warning restore AZPROVISION001
builder.Build().Run();
Im vorherigen Codebeispiel wird die Erstellung der Azure Container-App-Definition an den App-Host delegiert. Auf diese Weise können Sie die Azure Container-App-Definition anpassen, ohne azd infra synth
ausführen zu müssen und die generierten Bicep-Dateien unsicher zu ändern.