Delen via


Wat is nieuw in .NET.NET Aspire 9.0

📢 .NET Aspire 9.0 is de volgende algemene beschikbaarheidsrelease van .NET Aspire; het ondersteunt beide:

  • .NET 8.0 LTS of
  • .NET 9.0 Standard Term Support (STS).

Notitie

U kunt .NET Aspire 9,0 gebruiken met .NET 8 of .NET 9!

In deze release worden enkele van de meest aangevraagde functies en pijnpunten van de community aangepakt. De beste functies zijn communitygestuurd! Om deel te nemen aan de community, bezoek ons op Discord om te chatten met teamleden en samen te werken aan GitHub.

Zie voor meer informatie over de officiële .NET-versie en .NET Aspire versieondersteuning:

Upgraden naar .NET.NET Aspire 9

Als u een upgrade wilt uitvoeren van eerdere versies van .NET Aspire naar .NET Aspire 9, volgt u de instructies in de officiële Upgrade naar .NET.NET Aspire 9 handleiding. De handleiding bevat gedetailleerde instructies voor het upgraden van uw bestaande .NET Aspire-oplossingen voor .NET Aspire 9. Ongeacht of u dit handmatig doet of de upgradeassistent gebruikt, maakt de handleiding kort werk van het proces.

Verbeteringen in hulpprogramma's

.NET Aspire 9 maakt het eenvoudiger om uw omgeving te configureren voor het ontwikkelen van .NET Aspire toepassingen. U hebt geen .NET workload meer nodig. In plaats daarvan installeert u de nieuwe .NET.NET Aspire SDK- in het app-hostproject van uw .NET.NET Aspire-oplossingen. Voor meer informatie, zie .NET.NET Aspire installatie en hulpprogramma's.

Sjablonen zijn verplaatst

.NET .NET Aspire 9 verplaatst de inhoud die voorheen via de workload werd geïnstalleerd in afzonderlijke NuGet-pakketten. Dit omvat de sjablonen voor het maken van nieuwe .NET.NET Aspire projecten en oplossingen. Deze sjablonen worden geïnstalleerd met behulp van de opdracht dotnet new install. Deze kunnen worden geïnstalleerd door de volgende opdracht uit te voeren:

dotnet new install Aspire.ProjectTemplates::9.0.0

Tip

Als u de .NET.NET Aspire workload al hebt geïnstalleerd, moet u de --force vlag doorgeven om de bestaande sjablonen te overschrijven. U mag gerust de .NET.NET Aspire workload verwijderen.

Zie .NET.NET Aspire sjablonenvoor meer informatie.

Dashboard UX-verbeteringen en nieuwe interactiviteitsfuncties

Het .NET.NET Aspire dashboard blijft verbeteren bij elke release.

Levenscyclus van resources beheren

De meest aangevraagde functie voor het dashboard is het beheren van de levenscycli van uw georkestreerde benoemde resources. Met name de mogelijkheid om resources te stoppen, te starten en opnieuw te starten. Deze functie werkt voor projecten, containers en uitvoerbare bestanden. Hiermee kunt u afzonderlijke resources opnieuw opstarten zonder dat u de hele app-host opnieuw hoeft op te starten. Wanneer het foutopsporingsprogramma voor projectresources is gekoppeld, wordt het weer gekoppeld bij het opnieuw opstarten. Zie .NET.NET Aspire dashboard voor meer informatie: Een resource stoppen of starten.

Mobiele en responsieve ondersteuning

Het .NET Aspire-dashboard is nu mobielvriendelijk en responsief aangepast aan een breed scala aan schermgrootten en het inschakelen van on-the-go-beheer van geïmplementeerde .NET Aspire-toepassingen. Er zijn andere toegankelijkheidsverbeteringen aangebracht, waaronder de weergave van instellingen en inhoudsoverloop op mobiele apparaten.

Gevoelige eigenschappen, volumes en gezondheidscontroles in details van de bron

De weergave van resourcedetails bevat verschillende verbeteringen:

  • Eigenschappen kunnen worden gemarkeerd als gevoelig en automatisch worden gemaskeerd in de gebruikersinterface van het dashboard. Met deze beveiligingsfunctie voorkomt u dat sleutels of wachtwoorden per ongeluk worden weergegeven wanneer u het dashboard deelt met andere personen. Containerargumenten kunnen bijvoorbeeld gevoelige informatie doorgeven en dus standaard worden gemaskeerd.

  • Geconfigureerde containervolumes worden vermeld in resourcedetails.

  • .NET .NET Aspire 9 voegt ondersteuning toe voor statuscontroles. Gedetailleerde informatie over deze controles kan nu worden weergegeven in het deelvenster resourcedetails, waarin wordt weergegeven waarom een resource mogelijk als beschadigd of gedegradeerd kan worden gemarkeerd. Meer informatie over gezondheidscontroles hier.

Kleurrijk consolelogboek

ANSI-escapecodes tekst opmaken in terminals door kleuren (voorgrond en achtergrond) en stijlen zoals vet, onderstrepen en cursief te beheren. Voorheen kon de consolelogboekpagina van het dashboard slechts één ANSI-escapecode tegelijk weergeven. Dit mislukt wanneer meerdere codes werden gecombineerd. Het kan bijvoorbeeld rode tekst weergeven, maar geen tekst die zowel rood als vet was.

Een bijdrage van de community van @mangeg verbeterde ondersteuning voor ANSI-escapecodes en deze beperking is verwijderd.

Kleurrijke consolelogboeken

Een andere verbetering van consolelogboeken is het verbergen van niet-ondersteunde escape-codes. Codes die niet zijn gerelateerd aan het weergeven van tekst, zoals het plaatsen van de cursor of het communiceren met het besturingssysteem, zijn niet logisch in deze gebruikersinterface en zijn verborgen.

Telemetrie gebruikersgerichte toevoegingen

Telemetrie blijft een essentieel aspect van .NET.NET Aspire. In .NET.NET Aspire 9 zijn er veel nieuwe functies geïntroduceerd in de telemetrieservice.

Verbeterde telemetriefiltering

Traceringen kunnen worden gefilterd met kenmerkwaarden. Als u bijvoorbeeld alleen traceringen voor één eindpunt in uw app wilt weergeven, kan het kenmerk http.route op HTTP-aanvragen worden gefilterd op een opgegeven waarde.

Telemetriefiltering biedt ook ondersteuning voor automatisch aanvullen van bestaande waarden. Het dialoogvenster Filter toevoegen bevat een keuzelijst met invoervak voor het selecteren van waarden die het dashboard beschikbaar heeft. Met deze functie kunt u veel gemakkelijker filteren op echte gegevens en typfouten voorkomen door zelf een waarde in te voeren.

Voor meer informatie, zie dashboard .NET.NET Aspire: Traceringen filteren.

Telemetrie van meerdere resources combineren

Wanneer een resource meerdere replica's heeft, kunt u nu telemetrie filteren om gegevens van alle exemplaren tegelijk weer te geven. Selecteer de ouderresource met het label (application). Zie .NET.NET Aspire dashboard voor meer informatie: Telemetrie van meerdere resources combineren.

Ondersteuning voor browsertelemetrie

Het dashboard ondersteunt OpenTelemetry Protocol (OTLP) via HTTP en cross-origin resource sharing (CORS). Met deze functies kunt u OpenTelemetry verzenden vanuit browser-apps naar het .NET Aspire-dashboard.

Een browsergebaseerde app met één pagina (SPA) kan bijvoorbeeld de JavaScript OpenTelemetry SDK- configureren voor het verzenden van gestructureerde logboeken, traceringen en metrische gegevens die in de browser zijn gemaakt naar het dashboard. Browsertelemetrie wordt naast server telemetrie weergegeven.

Detailpagina traceren met browsertelemetrie

Zie Browsertelemetrie inschakelen documentatie voor meer informatie over het configureren van browsertelemetrie.

App Host (Orkestratie)

De .NET.NET Aspire app-host is een van de belangrijkste functies van .NET.NET Aspire. In .NET.NET Aspire 9 zijn er verschillende nieuwe functies toegevoegd die specifiek zijn voor de app-host.

Wachten op afhankelijkheden

Als u samen met .NET.NET Aspirehebt gevolgd, weet u al dat uw app-hostproject de locatie is waar u uw app-model definieert. U maakt een gedistribueerde applicatiebouwer, voegt resources toe en configureert ze, en drukt hun afhankelijkheden uit. U kunt nu opgeven dat een resource moet wachten op een andere resource voordat u begint. Dit kan helpen bij het voorkomen van verbindingsfouten tijdens het opstarten door alleen resources te starten wanneer hun afhankelijkheden 'gereed' zijn.

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();

Wanneer de app-host wordt gestart, wacht deze tot de rabbit resource gereed is voordat de api resource wordt gestart.

Er zijn twee methoden beschikbaar om te wachten op een resource:

  • WaitFor: wacht tot een resource gereed is voordat u een andere resource start.
  • WaitForCompletion: wacht totdat een resource is voltooid voordat u een andere resource start.

Zie .NET.NET Aspire app-host: Wachten op resourcesvoor meer informatie.

Resourcegezondheidscontroles

De WaitFor-API maakt gebruik van standaard .NET statuscontroles om te bepalen of een resource gereed is. Maar wat betekent 'een resource die klaar is'? Het beste is, dat kan worden geconfigureerd door de consument buiten hun standaardwaarden.

Wanneer een resource geen statuscontroles weergeeft (geen statuscontroles geregistreerd in de app), wacht de app-host totdat de resource de status Running heeft voordat de afhankelijke resource wordt gestart.

Voor resources die HTTP-eindpunten beschikbaar maken, kunt u eenvoudig een statuscontrole toevoegen waarmee een specifiek pad voor een HTTP 200-antwoord wordt gecontroleerd.

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();

In het voorgaande voorbeeld wordt een statuscontrole toegevoegd aan de catalog-api-resource. De app-host wacht totdat de gezondheidscontrole een gezonde status retourneert voordat de store-bron wordt gestart. Hiermee wordt bepaald dat de resource gereed is wanneer het /health-eindpunt een HTTP 200-statuscode retourneert.

Terwijl store wacht tot catalog-api in orde is, worden de resources in het dashboard weergegeven als:

Wachten op een ongezonde resource voordat u begint

Het statuscontrolemechanisme van de app-host bouwt voort op de IHealthChecksBuilder implementatie vanuit de Microsoft.Extensions.Diagnostics.HealthChecks naamruimte.

Gezondheidscontroles rapporteren gegevens, die worden weergegeven op het dashboard.

statuscontroledetails in de weergave resourcedetails van het dashboard

Het maken van een aangepaste gezondheidscontrole is eenvoudig. Begin met het definiëren van de statuscontrole en koppel vervolgens de naam aan alle resources waarop deze van toepassing is.

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);

In het voorgaande voorbeeld wordt een statuscontrole toegevoegd aan de cache-resource, die rapporteert dat deze gedurende de eerste 20 seconden nadat de app-host is gestart, niet gezond is. De myapp resource wacht dus 20 seconden voordat deze begint, zodat de cache resource in orde is.

De methoden AddCheck en WithHealthCheck bieden een eenvoudig mechanisme om statuscontroles te maken en deze te koppelen aan specifieke resources.

Volhardende containers

De app-host ondersteunt nu permanente containers. Permanente containers wijken af van de typische containers levenscyclus van .NET.NET Aspire georkestreerde apps. Terwijl ze zijn gemaakt en gestart (als ze nog niet beschikbaar zijn) door de .NET Aspire orchestrator, worden ze niet vernietigd door .NET Aspire.

Dit is handig als u de container actief wilt houden, zelfs nadat de app-host is gestopt.

Belangrijk

Als u deze containers wilt verwijderen, moet u deze handmatig stoppen met behulp van de containerruntime.

Als u een IResourceBuilder<ContainerResource> met een permanente levensduur wilt definiëren, roept u de WithLifetime methode aan en geeft u ContainerLifetime.Persistentdoor:

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();

Het dashboard toont permanente containers met een speldpictogram:

Permanente containers

Nadat de app-host is gestopt, blijft de container actief:

Docker bureaublad met RabbitMQ.

Het containerpersistentiemechanisme probeert te identificeren wanneer u de container mogelijk opnieuw wilt maken. Als de omgeving voor de container bijvoorbeeld wordt gewijzigd, wordt de container opnieuw opgestart, zodat u de container niet handmatig hoeft te stoppen als de invoerconfiguratie voor de resource is gewijzigd.

Resourceopdrachten

De app-host ondersteunt het toevoegen van aangepaste opdrachten aan resources. Dit is handig als u aangepaste functionaliteit wilt toevoegen die niet systeemeigen wordt ondersteund door de app-host. Er zijn waarschijnlijk veel mogelijkheden waarbij het beschikbaar maken van aangepaste extensiemethoden voor resources nuttig is. De .NET.NET Aspire Community Toolkit is mogelijk een goede plek om deze extensies te delen.

Wanneer u een aangepaste opdracht definieert, is deze beschikbaar in het dashboard als een functie voor gebruikerservaring.

Belangrijk

Deze .NET.NET Aspire dashboardopdrachten zijn alleen beschikbaar wanneer het dashboard lokaal wordt uitgevoerd. Ze zijn niet beschikbaar bij het uitvoeren van het dashboard in Azure Container Apps.

Zie voor meer informatie over het maken van aangepaste resourceopdrachten How-to: Aangepaste resourceopdrachten maken in .NET.NET Aspire.

Containernetwerken

De app-host voegt nu alle containers toe aan een gemeenschappelijk netwerk met de naam default-aspire-network. Dit is handig als u wilt communiceren tussen containers zonder het hostnetwerk te doorlopen. Dit maakt het ook eenvoudiger om te migreren van docker opstellen naar de app-host, omdat containers met elkaar kunnen communiceren met behulp van de containernaam.

Gebeurtenismodel

Met het gebeurtenismodel kunnen ontwikkelaars inhaken op de levenscyclus van de applicatie en middelen. Dit is handig voor het uitvoeren van aangepaste code op specifieke punten in de levenscyclus van de toepassing. Er zijn verschillende manieren om u te abonneren op gebeurtenissen, waaronder globale gebeurtenissen en gebeurtenissen per resource.

algemene gebeurtenissen:

  • BeforeStartEvent: een gebeurtenis die wordt geactiveerd voordat de toepassing wordt gestart. Dit is de laatste plaats waar wijzigingen in het app-model worden waargenomen. Dit wordt uitgevoerd in de modi Uitvoeren en Publiceren. Dit is een blokkerende gebeurtenis, wat betekent dat de toepassing pas wordt gestart als alle handlers zijn voltooid.
  • AfterResourcesCreatedEvent: een gebeurtenis die wordt geactiveerd nadat de resources zijn gemaakt. Dit wordt alleen uitgevoerd in de Run-modus.
  • AfterEndpointsAllocatedEvent: een gebeurtenis die wordt geactiveerd nadat de eindpunten zijn toegewezen voor alle resources. Dit wordt alleen uitgevoerd in de Run-modus.

De globale gebeurtenissen zijn vergelijkbaar met de levenscyclus van de app-host. Zie Levenscyclus van app-hostsvoor meer informatie.

gebeurtenissen per resource :

  • BeforeResourceStartedEvent: een gebeurtenis die wordt geactiveerd voordat één resource wordt gestart. Dit wordt alleen uitgevoerd in de uitvoeringsmodus. Dit is een blokkerende gebeurtenis, wat betekent dat de resource pas wordt gestart als alle handlers zijn voltooid.
  • ConnectionStringAvailableEvent: een gebeurtenis die wordt geactiveerd wanneer een verbindingsreeks beschikbaar is voor een resource. Dit werkt alleen in runmodus.
  • ResourceReadyEvent: een gebeurtenis die wordt geactiveerd wanneer een resource gereed is om te worden gebruikt. Dit wordt alleen uitgevoerd in de uitvoeringsmodus.

Zie Eventing in .NET.NET Aspirevoor meer informatie.

Integraties

.NET .NET Aspire blijft integraties toevoegen waarmee u eenvoudig aan de slag kunt met uw favoriete services en hulpprogramma's. Zie .NET.NET Aspire overzicht van integratiesvoor meer informatie.

Redis Insight

Ondersteuning voor Redis Insights- is beschikbaar op een Redis resource:

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.

De WithRedisInsight-extensiemethode kan worden toegepast op meerdere Redis resources en ze zijn allemaal zichtbaar op het dashboard Redis Insight.

Redis Insight-dashboard met meerdere Redis exemplaren

Zie Redis-resource toevoegen met Redis Insightsvoor meer informatie.

OpenAI (voorbeeld)

Vanaf .NET Aspire 9 is er een extra OpenAI-integratie beschikbaar waarmee de nieuwste officiële OpenAI dotnet-bibliotheek rechtstreeks kan worden gebruikt. De client-integratie registreert de OpenAIClient- als een singletonservice in de servicecollectie. De client kan worden gebruikt om te communiceren met de OpenAIREST-API.

Bovendien is de reeds beschikbare .NET AspireAzureOpenAI integratie verbeterd om een flexibele manier te bieden om een OpenAIClient te configureren voor een Azure AI OpenAI-service of een toegewezen OpenAIREST-API met de nieuwe AddOpenAIClientFromConfiguration(IHostApplicationBuilder, String) builder-methode. In het volgende voorbeeld wordt gedetecteerd of de verbindingsreeks voor een AzureAzure AI OpenAI-service is en de meest geschikte OpenAIClient instantie automatisch wordt geregistreerd.

builder.AddOpenAIClientFromConfiguration("openai");

Als de openai-verbinding er bijvoorbeeld uitziet als Endpoint=https://{account}.azure.com;Key={key}; zou deze een Azure AI OpenAIclient kunnen registreren vanwege de domeinnaam. Anders zou een gemeenschappelijk OpenAIClient worden gebruikt.

Lees Azure-agnostische client resolutie voor meer informatie.

MongoDB

Er is ondersteuning toegevoegd voor het opgeven van de MongoDB gebruikersnaam en het wachtwoord bij het gebruik van de AddMongoDB(IDistributedApplicationBuilder, String, Nullable<Int32>, IResourceBuilder<ParameterResource>, IResourceBuilder<ParameterResource>)-extensiemethode. Als dit niet is opgegeven, wordt een willekeurige gebruikersnaam en wachtwoord gegenereerd, maar kunnen ze handmatig worden opgegeven met behulp van parameterresources.

var builder = DistributedApplication.CreateBuilder(args);

var username = builder.AddParameter("mongousername");
var password = builder.AddParameter("mongopassword", secret: true);

var db = builder.AddMongo("db", username, password);

Belangrijke Azure verbeteringen

In de volgende secties worden Azure verbeteringen beschreven die zijn toegevoegd in .NET Aspire 9. Voor een volledige lijst van alle breaking changes, zie Breaking changes in .NET.NET Aspire 9.

Azure bronaanpassing

In .NET Aspire 8 zijn het aanpassen van Azure resources gemarkeerd als experimenteel omdat de onderliggende Azure.Provisioning bibliotheken nieuw waren en feedback verzamelden voordat ze konden worden gemarkeerd als stabiel. In .NET.NET Aspire 9 zijn deze API's bijgewerkt en wordt het experimentele kenmerk verwijderd.

Azure Wijziging in resourcenaamgeving

Als onderdeel van de update van de Azure.Provisioning-bibliotheken is het standaardnaamgevingsschema voor Azure resources bijgewerkt met betere ondersteuning voor verschillende naamgevingsbeleidsregels. Deze update heeft echter geleid tot een wijziging in de naam van resources. Het nieuwe naamgevingsbeleid kan ertoe leiden dat de bestaande Azure resources worden verlaten en dat er nieuwe Azure resources worden gemaakt, na het bijwerken van uw .NET Aspire-toepassing van 8 naar 9. Als u hetzelfde naamgevingsbeleid van .NET.NET Aspire 8 wilt blijven gebruiken, kunt u de volgende code toevoegen aan uw AppHost-Program.cs:

var builder = DistributedApplication.CreateBuilder(args);

builder.Services.Configure<AzureProvisioningOptions>(options =>
{
    options.ProvisioningBuildOptions.InfrastructureResolvers.Insert(0, new AspireV8ResourceNamePropertyResolver());
});

Azure SQL, PostgreSQLen Redis Bijwerken

Azure SQL-, PostgreSQL- en Redis-resources verschillen van andere Azure resources, omdat er lokale containerbronnen voor deze technologieën zijn. In .NET Aspire 8, om deze Azure-resources te creëren, moest u beginnen met een lokale containerresource en deze vervolgens "Als" of "PublishAs" naar een Azure-resource omzetten. Dit ontwerp heeft problemen geïntroduceerd en past niet bij andere API's.

U hebt deze code bijvoorbeeld in .NET.NET Aspire 8:

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 zijn deze API's gemarkeerd als verouderd en is er een nieuw API-patroon geïmplementeerd:

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 als standaard

Om .NET Aspire toepassingen veiliger te maken, zijn Azure Database for PostgreSQL- en Azure Cache for Redis-resources bijgewerkt om standaard Microsoft Entra-id te gebruiken. Hiervoor moeten wijzigingen worden aangebracht in toepassingen die verbinding moeten maken met deze resources. Zie het volgende voor het bijwerken van toepassingen voor het gebruik van Microsoft Entra ID om verbinding te maken met deze resources:

In de volgende voorbeelden ziet u hoe u uw toepassing configureert om verbinding te maken met de Azure resources met behulp van Microsoft Entra-id:

Als u verificatie met een wachtwoord of toegangssleutel wilt gebruiken (niet aanbevolen), kunt u zich aanmelden met de volgende code:

var builder = DistributedApplication.CreateBuilder(args);

var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
                   .WithPasswordAuthentication();

var cache = builder.AddAzureRedis("cache")
                   .WithAccessKeyAuthentication();

Ondersteuning voor Azure Functions (preview)

Ondersteuning voor Azure Functions- is een van de meest aangevraagde functies op de .NET.NET Aspire probleemtracker en we introduceren graag preview-ondersteuning voor deze functie in deze release. Om deze ondersteuning te demonstreren, gebruiken we .NET.NET Aspire om een webhook te maken en te implementeren.

Als u wilt beginnen, maakt u een nieuw Azure Functions-project met behulp van het dialoogvenster Visual Studio Nieuw project. Wanneer u hierom wordt gevraagd, schakelt u het selectievakje Enlist in Aspire orkestratie in bij het maken van het project.

Een nieuw .NET AspireAzure Functions-project maken.

In het app-hostproject ziet u dat er een PackageReference is voor de nieuwe 📦Aspire.Hosting.Azure.Functions NuGet-pakket:

<ItemGroup>
    <PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
    <PackageReference Include="Aspire.Hosting.Azure.Functions" Version="9.0.0" />
</ItemGroup>

Dit pakket biedt een AddAzureFunctionsProject<TProject>(IDistributedApplicationBuilder, String)-API die kan worden aangeroepen in de app-host om Azure Functions-projecten binnen een .NET Aspire-host te configureren:

var builder = DistributedApplication.CreateBuilder(args);

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp");

builder.Build().Run();

In dit voorbeeld is de webhook verantwoordelijk voor het vertalen van een invoertekenreeks in Pig Latin. Werk de inhoud van onze trigger bij met de volgende 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';
}

Stel een onderbrekingspunt in op de eerste logger.LogInformation regel van de methode Run en druk op F5- om de Functions-host te starten. Zodra het .NET.NET Aspire dashboard is gestart, ziet u het volgende:

Schermopname van de .NET Aspire die wordt uitgevoerd met een Azure Function-app.

.NET .NET Aspire heeft:

  • Er is een geëmuleerde Azure Opslagresource geconfigureerd die door de host moet worden gebruikt voor boekhouding.
  • De Functions-host lokaal gestart met als doel het Functions-project te registreren.
  • Bekabeld de poort die is gedefinieerd in launchSettings.json van het functions-project voor luisteren.

Gebruik je favoriete HTTP-client-methode om een verzoek naar de trigger te sturen en observeer in de debugger de invoeren die gebonden zijn vanuit de body van het verzoek.

curl --request POST \
  --url http://localhost:7282/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

Schermopname van het .NET Aspire-dashboard: Fouten opsporen in een Azure Functie-app.

U bent nu klaar om onze toepassing te implementeren in Azure Container Apps (ACA). De implementatie is momenteel afhankelijk van preview-versies van Azure Functions Worker- en Worker SDK-pakketten. Voer indien nodig een upgrade uit van de versies waarnaar wordt verwezen in het Functions-project:

<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>

U moet ook een openbaar eindpunt beschikbaar maken voor ons Azure Functions-project, zodat aanvragen kunnen worden verzonden naar onze HTTP-trigger:

builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp")
       .WithExternalHttpEndpoints();

Als u de toepassing wilt implementeren met de azd CLI-, hebt u eerst de nieuwste versie nodig. Als u de nieuwste versie wilt installeren, ziet u een waarschuwing als uw versie verouderd is. Volg de instructies om bij te werken naar de nieuwste versie.

Nadat deze is geïnstalleerd, gaat u naar de map met het app-hostproject en voert u azd inituit:

$ 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!

Implementeer vervolgens de toepassing door azd upuit te voeren:

$ 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}}

Test ten slotte uw geïmplementeerde Functions-toepassing met behulp van uw favoriete HTTP-client:

curl --request POST \
  --url {{endpoint-url}}/api/Function1 \
  --header 'Content-Type: application/json' \
  --data '{
  "value": "Welcome to Azure Functions"
}'

Ondersteuning voor Azure Functions in .NET Aspire is nog steeds in preview met ondersteuning voor een beperkte set triggers, waaronder:

Zie de officiële .NET AspireAzure Functions-integratie (preview)-voor meer informatie.

Aanpassing van Azure Container Apps

Een van de meest aangevraagde functies is de mogelijkheid om de Azure Container Apps die de app-host maakt aan te passen zonder Bicep aan te raken. Dit is mogelijk met behulp van de PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>)- en PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>)-API's in de Aspire.Hosting.Azure.AppContainers naamruimte. Met deze methoden wordt de Azure container-app-definitie aangepast die door de app-host wordt gemaakt.

Voeg de pakketreferentie toe aan uw projectbestand:

<ItemGroup>
  <PackageReference Include="Aspire.Hosting.Azure.AppContainers"
                    Version="9.0.0" />
</ItemGroup>

In het volgende voorbeeld ziet u hoe u een Azure Container App schaalt naar nul (0) replica's:

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();

In het voorgaande codevoorbeeld wordt het genereren van de definitie van de Azure Container App uitgesteld naar de app-host. Hiermee kunt u de definitie van de Azure Container App aanpassen zonder dat u azd infra synth hoeft uit te voeren en de gegenereerde bicep-bestanden onveilig hoeft te wijzigen.

Zie ook