Co nowego w programie .NET.NET Aspire 9.0
📢 .NET Aspire 9.0 to kolejna główna wersja ogólnodostępna .NET Aspire; obsługuje oba:
- .NET 8.0 Long Term Support (LTS) lub lub
- .NET 9.0 Wsparcie Okresu Standardowego (STS).
Notatka
Możesz użyć .NET Aspire 9.0 z .NET 8 lub .NET 9!
Ta wersja adresuje niektóre z najczęściej poszukiwanych funkcji i zgłaszanych przez społeczność problemów. Najlepsze funkcje są oparte na społeczności! Aby dołączyć do społeczności, odwiedź nas na Discord, aby porozmawiać z członkami zespołu i współpracować z nami w GitHub.
Aby uzyskać więcej informacji na temat oficjalnej wersji .NET i obsługi wersji .NET Aspire, zobacz:
- .NET polityka wsparcia: definicje dla LTS i STS.
- .NET .NET Aspire polityka wsparcia: ważne unikatowe szczegóły cyklu życia produktu.
Uaktualnianie do .NET.NET Aspire 9
Aby uaktualnić starsze wersje .NET Aspire do wersji .NET Aspire 9, postępuj zgodnie z instrukcjami w oficjalnym przewodniku Upgrade to .NET.NET Aspire 9. Przewodnik zawiera szczegółowe instrukcje dotyczące uaktualniania istniejących rozwiązań .NET Aspire do .NET Aspire 9. Niezależnie od tego, czy wykonujesz to ręcznie lub przy użyciu Asystenta aktualizacji, przewodnik ułatwia i skraca cały proces.
Ulepszenia narzędzi
.NET Aspire 9 ułatwia skonfigurowanie środowiska do tworzenia aplikacji .NET Aspire. Nie potrzebujesz już obciążenia .NET. Zamiast tego należy zainstalować nowy pakiet SDK .NET.NET Aspire w projekcie hosta dla aplikacji z rozwiązań .NET.NET Aspire. Aby uzyskać więcej informacji, zobacz .NET.NET Aspire konfigurację i narzędzia.
Szablony zostały przeniesione
.NET
.NET Aspire 9 przenosi zawartość, która została zainstalowana za pośrednictwem obciążenia do oddzielnych pakietów NuGet. Obejmuje to szablony tworzenia nowych projektów i rozwiązań .NET.NET Aspire. Te szablony są instalowane przy użyciu polecenia dotnet new install
. Można je zainstalować, uruchamiając następujące polecenie:
dotnet new install Aspire.ProjectTemplates::9.0.0
Napiwek
Jeśli masz już zainstalowane obciążenie .NET.NET Aspire, musisz przekazać flagę --force
, aby zastąpić istniejące szablony. Możesz śmiało odinstalować pakiet roboczy .NET.NET Aspire.
Aby uzyskać więcej informacji, zobacz .NET.NET Aspire szablony.
Ulepszenia środowiska użytkownika pulpitu nawigacyjnego i nowe funkcje interakcyjności
Panel sterowania .NET.NET Aspire nadal ulepsza się wraz z każdą wersją.
Zarządzanie cyklem życia zasobów
Najbardziej żądaną funkcją pulpitu nawigacyjnego jest zarządzanie cyklami życia zorganizowanych nazwanych zasobów. W szczególności możliwość zatrzymywania, uruchamiania i ponownego uruchamiania zasobów. Ta funkcja działa w przypadku projektów, kontenerów i plików wykonywalnych. Umożliwia ponowne uruchamianie poszczególnych zasobów bez konieczności ponownego uruchamiania całego hosta aplikacji. W przypadku zasobów projektu po dołączeniu debugera jest on ponownie dołączany po ponownym uruchomieniu. Aby uzyskać więcej informacji, zobacz .NET.NET Aspire pulpit: Zatrzymaj lub Uruchom zasób.
Obsługa mobilna i elastyczna
Pulpit nawigacyjny .NET Aspire jest teraz przyjazny dla urządzeń przenośnych, szybko dostosowuje się do szerokiej gamy rozmiarów ekranu i umożliwia zarządzanie wdrożonych aplikacji .NET Aspire. Wprowadzono inne ulepszenia ułatwień dostępu, w tym wyświetlanie ustawień oraz przeciążenie treści na urządzeniach mobilnych.
Poufne właściwości, woluminy i kontrole stanu w szczegółach zasobu
Wyświetlanie szczegółów zasobu zawiera kilka ulepszeń:
Właściwości można oznaczyć jako poufne, automatycznie maskując je w interfejsie użytkownika pulpitu nawigacyjnego. Ta funkcja zabezpieczeń pomaga uniknąć przypadkowego ujawnienia kluczy lub haseł podczas udostępniania pulpitu nawigacyjnego innym osobom. Na przykład argumenty kontenera mogą przekazywać poufne informacje i tak są domyślnie maskowane.
Skonfigurowane woluminy kontenerów są wyświetlane w szczegółach zasobu.
.NET .NET Aspire 9 dodaje obsługę kontroli kondycji. Szczegółowe informacje na temat tych testów można teraz wyświetlić w okienku szczegółów zasobu, pokazując, dlaczego zasób może być oznaczony jako w złej kondycji lub obniżonej wydajności. Dowiedz się więcej na temat kontroli kondycji tutaj.
Kolorowy dziennik konsoli
kody ucieczki ANSI formatują tekst w terminalach, kontrolując kolorami (tekstu i tła) oraz stylami, takimi jak pogrubienie, podkreślenie i kursywa. Wcześniej strona dzienników konsoli pulpitu nawigacyjnego mogła renderować na raz tylko jeden kod ucieczki ANSI, co powodowało problemy przy połączeniu wielu kodów. Może na przykład wyświetlać czerwony tekst, ale nie tekst, który był zarówno czerwony, jak i pogrubiony.
Wkład społeczności od @mangeg ulepszył obsługę kodów ucieczki ANSI i usunął to ograniczenie.
Innym ulepszeniem dzienników konsoli jest ukrywanie nieobsługiwanych kodów ucieczki. Kody, które nie są związane z wyświetlaniem tekstu, takie jak pozycjonowanie kursora lub komunikacja z systemem operacyjnym, nie mają sensu w tym interfejsie użytkownika i są ukryte.
Dodatki telemetrii skoncentrowane na użytkowniku
telemetria pozostaje istotnym aspektem .NET.NET Aspire. W .NET.NET Aspire 9 wprowadzono wiele nowych funkcji usługi Telemetria.
Ulepszone filtrowanie danych telemetrycznych
Ślady można filtrować za pomocą wartości atrybutów. Jeśli na przykład chcesz wyświetlić tylko ślady dla jednego punktu końcowego w aplikacji, atrybut http.route
dla żądań HTTP można filtrować do określonej wartości.
Filtrowanie danych telemetrycznych obsługuje również autouzupełnianie istniejących wartości. Okno dialogowe Dodawanie filtru zawiera pole kombi umożliwiające wybór spośród wartości dostępnych na pulpicie nawigacyjnym. Ta funkcja znacznie ułatwia filtrowanie rzeczywistych danych i pomaga uniknąć literówek przez samodzielne wprowadzanie wartości.
Więcej informacji znajdziesz na pulpicie nawigacyjnym .NET.NET Aspire: Filtruj ślady.
Łączenie danych telemetrycznych z wielu zasobów
Gdy zasób ma wiele replik, można teraz filtrować dane telemetryczne, aby wyświetlać dane ze wszystkich wystąpień jednocześnie. Wybierz zasób nadrzędny oznaczony (application)
. Aby uzyskać więcej informacji, zobacz pulpit nawigacyjny .NET.NET Aspire: Łączenie danych telemetrycznych z wielu zasobów.
Obsługa telemetrii przeglądarki
Pulpit nawigacyjny obsługuje protokół OpenTelemetry (OTLP) za pośrednictwem protokołu HTTP i współużytkowania zasobów między źródłami (CORS). Te funkcje umożliwiają wysyłanie OpenTelemetry z aplikacji przeglądarki do pulpitu nawigacyjnego .NET Aspire.
Na przykład aplikacja jednostronicowa oparta na przeglądarce (SPA) może skonfigurować JavaScript OpenTelemetry SDK do wysyłania dzienników strukturalnych, śladów i metryk utworzonych w przeglądarce do pulpitu nawigacyjnego. Dane telemetryczne przeglądarki są wyświetlane obok telemetrii server.
strona szczegółowa śladu z telemetrią przeglądarki
Aby uzyskać więcej informacji na temat konfigurowania telemetrii przeglądarki, zapoznaj się z dokumentacją Włączanie telemetrii przeglądarki.
Host aplikacji (orkiestracja)
Host aplikacji .NET.NET Aspire jest jedną z najważniejszych funkcji .NET.NET Aspire. W .NET.NET Aspire 9 dodano kilka nowych funkcji specyficznych dla hosta aplikacji.
Oczekiwanie na zależności
Jeśli korzystasz z .NET.NET Aspire, wiesz już, że projekt hosta aplikacji jest miejscem definiowania modelu aplikacji. Utworzysz konstruktora aplikacji rozproszonej, dodasz i skonfigurujesz zasoby oraz wyrazisz ich zależności. Teraz można określić, że zasób powinien poczekać na inny zasób przed rozpoczęciem. Może to pomóc uniknąć błędów połączenia podczas uruchamiania, uruchamiając zasoby tylko wtedy, gdy ich zależności są "gotowe".
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();
Po uruchomieniu hosta aplikacji czeka na przygotowanie zasobu rabbit
przed uruchomieniem zasobu api
.
Istnieją dwie metody dostępne do oczekiwania na zasób:
- WaitFor: Poczekaj, aż zasób będzie gotowy przed uruchomieniem innego zasobu.
- WaitForCompletion: poczekaj na ukończenie zasobu przed uruchomieniem innego zasobu.
Aby uzyskać więcej informacji, zobacz .NET.NET Aspire hosta aplikacji: Oczekiwanie na zasoby.
Testy kondycji zasobów
Interfejs API WaitFor
używa standardowych kontroli kondycji .NET w celu określenia, czy zasób jest gotowy. Ale co oznacza "gotowy zasób"? Najlepszą częścią jest to, że można to skonfigurować przez użytkownika poza ich wartościami domyślnymi.
Gdy zasób nie udostępnia żadnych kontroli stanu zdrowia (bez kontroli stanu zdrowia zarejestrowanych w aplikacji), host aplikacji czeka, aż zasób osiągnie stan Running przed uruchomieniem zasobu zależnego.
W przypadku zasobów, które uwidaczniają punkty końcowe HTTP, można łatwo dodać kontrolę kondycji, która sonduje określoną ścieżkę dla odpowiedzi HTTP 200.
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();
W poprzednim przykładzie dodano kontrolę kondycji do zasobu catalog-api
. Host aplikacji czeka, aż kontrola zdrowia potwierdzi stan dobrego zdrowia, zanim uruchomi zasób store
. Określa, że zasób jest gotowy, gdy punkt końcowy /health
zwraca kod stanu HTTP 200.
Podczas gdy store
czeka, aż catalog-api
powróci do zdrowia, zasoby na pulpicie nawigacyjnym są wyświetlane jako:
Mechanizm sprawdzania stanu zdrowia hosta aplikacji opiera się na implementacji IHealthChecksBuilder z przestrzeni nazw Microsoft.Extensions.Diagnostics.HealthChecks.
Dane raportu kontroli kondycji wyświetlane na pulpicie nawigacyjnym:
Tworzenie niestandardowej kontroli zdrowia jest proste. Zacznij od zdefiniowania kontroli kondycji, a następnie skojarz jej nazwę z dowolnymi zasobami, do których ma zastosowanie.
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);
Powyższy przykład dodaje kontrolę kondycji do zasobu cache
, który raportuje go jako w złej kondycji przez pierwsze 20 sekund po uruchomieniu hosta aplikacji. Dlatego zasób myapp
czeka 20 sekund przed rozpoczęciem, zapewniając, że zasób cache
jest w dobrej kondycji.
Metody AddCheck i WithHealthCheck zapewniają prosty mechanizm tworzenia kontroli kondycji i kojarzenia ich z określonymi zasobami.
Kontenery trwałe
Host aplikacji teraz obsługuje trwałe kontenery i. Kontenery persystentne odbiegają od standardowego cyklu życia kontenerów .NET.NET Aspire zorkiestrowanych aplikacji. Chociaż są tworzone i uruchamiane przez orkiestratora .NET Aspire (jeśli nie są jeszcze dostępne), nie są niszczone przez .NET Aspire.
Jest to przydatne, gdy chcesz zachować działanie kontenera nawet po zatrzymaniu hosta aplikacji.
Ważny
Aby usunąć te kontenery, należy ręcznie zatrzymać je przy użyciu systemu uruchamiającego kontenery.
Aby zdefiniować IResourceBuilder<ContainerResource>
o trwałym okresie istnienia, wywołaj metodę WithLifetime i przekaż 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();
Na pulpicie nawigacyjnym są wyświetlane trwałe kontenery z ikoną pinezki:
Po zatrzymaniu hosta aplikacji kontener będzie nadal działać:
Mechanizm trwałości kontenera próbuje zidentyfikować, kiedy warto ponownie utworzyć kontener. Jeśli na przykład środowisko kontenera ulegnie zmianie, kontener zostanie uruchomiony ponownie, aby nie trzeba było ręcznie zatrzymywać kontenera, jeśli konfiguracja wejściowa zasobu uległa zmianie.
Polecenia zasobów
Host aplikacji obsługuje dodawanie poleceń niestandardowych do zasobów. Jest to przydatne, gdy chcesz dodać funkcje niestandardowe, które nie są natywnie obsługiwane przez hosta aplikacji. Istnieje prawdopodobnie wiele możliwości, w których uwidacznianie niestandardowych metod rozszerzeń w zasobach będzie przydatne. .NET .NET Aspire Community Toolkit może być dobrym miejscem do udostępniania tych rozszerzeń.
Po zdefiniowaniu polecenia niestandardowego jest on dostępny na pulpicie nawigacyjnym jako funkcja środowiska użytkownika.
Ważny
Te .NET.NET Aspire polecenia pulpitu nawigacyjnego są dostępne tylko w przypadku lokalnego uruchamiania pulpitu nawigacyjnego. Nie są one dostępne podczas uruchamiania pulpitu nawigacyjnego w Azure Container Apps.
Aby uzyskać więcej informacji na temat tworzenia niestandardowych poleceń zasobów, zobacz Jak zrobić: tworzenie niestandardowych poleceń zasobów w programie .NET.NET Aspire.
Sieć kontenerów
Host aplikacji dodaje teraz wszystkie kontenery do wspólnej sieci o nazwie default-aspire-network
. Jest to przydatne, gdy chcesz komunikować się między kontenerami bez przechodzenia przez sieć hosta. Ułatwia to również migrację z docker Compose do hosta aplikacji, ponieważ kontenery mogą się komunikować przy użyciu nazwy kontenera.
Model zdarzeń
Model zdarzeń umożliwia deweloperom łączenie się z cyklem życia aplikacji i zasobów. Jest to przydatne w przypadku uruchamiania kodu niestandardowego w określonych punktach cyklu życia aplikacji. Istnieją różne sposoby subskrybowania zdarzeń, w tym zdarzeń globalnych i zdarzeń dla poszczególnych zasobów.
Zdarzenia globalne:
- BeforeStartEvent: zdarzenie wyzwalane przed uruchomieniem aplikacji. Jest to ostatnie miejsce, w których są obserwowane zmiany modelu aplikacji. Działa to zarówno w trybach "Uruchom", jak i "Publikuj". Jest to zdarzenie blokujące, co oznacza, że aplikacja nie uruchamia się do momentu ukończenia wszystkich procedur obsługi.
- AfterResourcesCreatedEvent: zdarzenie wyzwalane po utworzeniu zasobów. To działa tylko w trybie uruchamiania.
- AfterEndpointsAllocatedEvent: zdarzenie wyzwalane po przydzieleniu punktów końcowych dla wszystkich zasobów. To działa tylko w trybie uruchamiania.
Zdarzenia globalne są analogiczne do zdarzeń cyklu życia hosta aplikacji. Aby uzyskać więcej informacji, zobacz Cykle życia hosta aplikacji.
zdarzenia na zasób:
- BeforeResourceStartedEvent: zdarzenie wyzwalane przed uruchomieniem pojedynczego zasobu. To działa tylko w trybie uruchamiania. Jest to zdarzenie blokujące, co oznacza, że zasób nie zostanie uruchomiony do momentu ukończenia wszystkich procedur obsługi.
- ConnectionStringAvailableEvent: Zdarzenie, które jest wyzwalane, gdy ciąg połączenia jest dostępny dla zasobu. To działa tylko w trybie uruchamiania.
- ResourceReadyEvent: zdarzenie wyzwalane, gdy zasób jest gotowy do użycia. To działa tylko w trybie uruchomieniowym.
Aby uzyskać więcej informacji, zobacz Wydarzenia w .NET.NET Aspire.
Integracje
.NET .NET Aspire nadal dodaje integracje, które ułatwiają rozpoczęcie korzystania z ulubionych usług i narzędzi. Aby uzyskać więcej informacji, zobacz omówienie integracji .NET.NET Aspire.
Redis Insight
Wsparcie dla Redis Insights jest dostępne na zasobie Redis.
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.
Metodę rozszerzenia WithRedisInsight można zastosować do wielu zasobów Redis, a każda z nich będzie widoczna na pulpicie nawigacyjnym usługi Redis Insight.
Aby uzyskać więcej informacji, zobacz Dodawanie zasobu Redis za pomocą usługi Redis Insights.
OpenAI (wersja zapoznawcza)
Począwszy od .NET Aspire 9, dostępna jest dodatkowa integracja OpenAI, która umożliwia bezpośrednie korzystanie z najnowszej oficjalnej biblioteki OpenAI dotnet. Integracja client rejestruje OpenAIClient jako pojedyncza usługa w kolekcji usług. client może służyć do interakcji z API OpenAIREST.
Ponadto ulepszono już dostępną integrację .NET AspireAzureOpenAI, aby zapewnić elastyczny sposób konfigurowania OpenAIClient
dla usługi Azure AI OpenAI lub dedykowanego interfejsu API OpenAIREST z nową metodą konstruktora AddOpenAIClientFromConfiguration(IHostApplicationBuilder, String). Poniższy przykład wykrywa, czy parametry połączenia są przeznaczone dla usługi AzureAzure AI OpenAI i automatycznie rejestruje najbardziej odpowiednie wystąpienie OpenAIClient
.
builder.AddOpenAIClientFromConfiguration("openai");
Jeśli na przykład połączenie openai
wyglądało jak Endpoint=https://{account}.azure.com;Key={key};
zgadywałoby, że może zarejestrować Azure AI OpenAIclient z powodu nazwy domeny. W przeciwnym razie będzie używany standardowy OpenAIClient
.
Aby uzyskać więcej informacji, przeczytaj Azure-agnostic client rezolucję.
MongoDB
Dodano obsługę określania nazwy użytkownika i hasła MongoDB podczas korzystania z metody rozszerzenia AddMongoDB(IDistributedApplicationBuilder, String, Nullable<Int32>, IResourceBuilder<ParameterResource>, IResourceBuilder<ParameterResource>). Jeśli nie zostanie określony, zostanie wygenerowana losowa nazwa użytkownika i hasło, ale można je określić ręcznie przy użyciu zasobów parametrów.
var builder = DistributedApplication.CreateBuilder(args);
var username = builder.AddParameter("mongousername");
var password = builder.AddParameter("mongopassword", secret: true);
var db = builder.AddMongo("db", username, password);
Ważne ulepszenia Azure
W poniższych sekcjach opisano ulepszenia Azure dodane w .NET Aspire 9. Aby uzyskać pełną listę wszystkich zmian powodujących niezgodność, zobacz Zmiany powodujące niezgodność w .NET.NET Aspire 9.
Azure dostosowywanie zasobów
W .NET Aspire 8 dostosowywanie zasobów Azure zostało oznaczone jako eksperymentalne, ponieważ podstawowe biblioteki Azure.Provisioning
były nowe i zbierały opinie, zanim będą one oznaczone jako stabilne. W .NET.NET Aspire 9 te interfejsy API zostały zaktualizowane i usunięto atrybut eksperymentalny.
zmiana powodująca niezgodność nazw zasobów Azure
W ramach aktualizacji bibliotek Azure.Provisioning domyślny schemat nazewnictwa dla zasobów Azure został zaktualizowany o lepszą obsługę różnych zasad nazewnictwa. Jednak ta aktualizacja spowodowała zmianę sposobu, w jaki zasoby są nazwane. Nowe zasady nazewnictwa mogą spowodować porzucenie istniejących zasobów Azure i utworzenie nowych zasobów Azure po zaktualizowaniu aplikacji .NET Aspire z wersji 8 do wersji 9. Aby nadal używać tych samych zasad nazewnictwa z .NET.NET Aspire 8, możesz dodać następujący kod do Program.csAppHost:
var builder = DistributedApplication.CreateBuilder(args);
builder.Services.Configure<AzureProvisioningOptions>(options =>
{
options.ProvisioningBuildOptions.InfrastructureResolvers.Insert(0, new AspireV8ResourceNamePropertyResolver());
});
Azure SQL, PostgreSQLi Redis Aktualizacja
Azure zasoby SQL, PostgreSQLi Redis różnią się od innych zasobów Azure, ponieważ dla tych technologii istnieją lokalne zasoby kontenera. W .NET Aspire 8, aby utworzyć te Azure zasoby, należało zaczynać od lokalnego zasobu kontenera, a następnie "As" lub "PublishAs" do zasobu Azure. Ten projekt wprowadził problemy i nie pasuje do innych interfejsów API.
Możesz na przykład mieć ten kod w .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();
W .NET.NET Aspire 9 te interfejsy API zostały oznaczone jako przestarzałe i zaimplementowano nowy wzorzec interfejsu API:
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 domyślnie
Aby zwiększyć bezpieczeństwo aplikacji .NET Aspire, baza danych Azure dla PostgreSQL oraz zasoby Azure Cache for Redis zostały zaktualizowane, aby domyślnie używać Microsoft Entra ID. Wymaga to zmian w aplikacjach, które muszą łączyć się z tymi zasobami. Aby zaktualizować aplikacje do używania identyfikatora Entra firmy Microsoft w celu nawiązania połączenia z tymi zasobami, zobacz następujące informacje:
W poniższych przykładach pokazano, jak skonfigurować aplikację w celu nawiązania połączenia z zasobami Azure przy użyciu identyfikatora Entra firmy Microsoft:
Jeśli musisz użyć uwierzytelniania za pomocą hasła lub klucza dostępu (niezalecane), możesz wyrazić zgodę na użycie następującego kodu:
var builder = DistributedApplication.CreateBuilder(args);
var pgsql = builder.AddAzurePostgresFlexibleServer("pgsql")
.WithPasswordAuthentication();
var cache = builder.AddAzureRedis("cache")
.WithAccessKeyAuthentication();
Obsługa funkcji Azure (wersja zapoznawcza)
Obsługa Azure Functions jest jedną z najczęściej żądanych funkcji w monitorze problemów .NET.NET Aspire i cieszymy się, że w tej wersji wprowadzono obsługę wersji zapoznawczej. Aby zademonstrować tę obsługę, użyjmy .NET.NET Aspire do utworzenia i wdrożenia webhooka.
Aby rozpocząć, utwórz nowy projekt Azure Functions przy użyciu okna dialogowego Visual Studio Nowy Projekt. Po wyświetleniu monitu zaznacz pole wyboru Enlist in Aspire orchestration podczas tworzenia projektu.
W projekcie hosta aplikacji zwróć uwagę, że jest PackageReference
do nowego 📦Aspire.Hosting.Azure.Pakiet NuGet dla usługi Functions:
<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
<PackageReference Include="Aspire.Hosting.Azure.Functions" Version="9.0.0" />
</ItemGroup>
Ten pakiet udostępnia interfejs API AddAzureFunctionsProject<TProject>(IDistributedApplicationBuilder, String), który można wywołać na hoście aplikacji w celu skonfigurowania projektów usługi Azure Functions na hoście .NET Aspire:
var builder = DistributedApplication.CreateBuilder(args);
builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp");
builder.Build().Run();
W tym przykładzie element webhook jest odpowiedzialny za tłumaczenie ciągu wejściowego na język Pig Latin. Zaktualizuj zawartość wyzwalacza przy użyciu następującego kodu:
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';
}
Ustaw punkt przerwania w pierwszym wierszu logger.LogInformation
metody Run
i naciśnij F5, aby uruchomić hosta usługi Functions. Po uruchomieniu pulpitu nawigacyjnego .NET.NET Aspire obserwujesz następujące kwestie:
.NET .NET Aspire ma:
- Skonfigurowano emulowany zasób usługi Azure Storage do użycia na potrzeby księgowania przez hosta.
- Uruchomiono host funkcji lokalnie z celem ustawionym na zarejestrowany projekt funkcji.
- ** Podłącz port zdefiniowany w ustawieniach uruchamiania .json projektu funkcji w celu nasłuchiwania.
Użyj swojego ulubionego HTTP client, aby wysłać żądanie do wyzwalacza i obserwować dane wejściowe powiązane z treścią tego żądania w debugerze.
curl --request POST \
--url http://localhost:7282/api/Function1 \
--header 'Content-Type: application/json' \
--data '{
"value": "Welcome to Azure Functions"
}'
Teraz jesteś gotowy do wdrożenia aplikacji do Azure Container Apps (ACA). Wdrożenie jest obecnie zależne od wersji zapoznawczych pakietów roboczych Azure Functions Worker oraz Worker SDK. W razie potrzeby uaktualnij wersje, do których odwołuje się projekt usługi Functions:
<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>
Musisz również udostępnić publiczny punkt końcowy dla naszego projektu usługi Azure Functions, aby żądania mogły być wysyłane do naszego wyzwalacza HTTP:
builder.AddAzureFunctionsProject<Projects.PigLatinApp>("piglatinapp")
.WithExternalHttpEndpoints();
Aby wdrożyć aplikację przy użyciu interfejsu wiersza polecenia azd
, najpierw musisz pobrać tę najnowszą wersję. Aby zainstalować najnowszą wersję, zostanie wyświetlone ostrzeżenie, jeśli wersja jest nieaktualna. Postępuj zgodnie z instrukcjami, aby zaktualizować do najnowszej wersji.
Po zainstalowaniu przejdź do folderu zawierającego projekt hosta aplikacji i uruchom azd init
:
$ 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!
Następnie wdróż aplikację, uruchamiając azd up
:
$ 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}}
Na koniec przetestuj wdrożoną aplikację Functions przy użyciu swojego ulubionego HTTP client.
curl --request POST \
--url {{endpoint-url}}/api/Function1 \
--header 'Content-Type: application/json' \
--data '{
"value": "Welcome to Azure Functions"
}'
Obsługa funkcji Azure w .NET Aspire jest nadal dostępna w wersji zapoznawczej z obsługą ograniczonego zestawu wyzwalaczy, w tym:
- wyzwalacze HTTP
- wyzwalacze kolejki Azure Storage
- Wyzwalacze obiektów Blob w usłudze Azure Storage
- wyzwalacze Azure Service Bus
- Azure Event Hubs wyzwala
Aby uzyskać więcej informacji, zobacz integrację funkcji .NET AspireAzure (oficjalna wersja próbna).
Dostosowywanie Azure Container Apps
Jedną z najbardziej poszukiwanych funkcji jest możliwość dostosowania Azure Container Apps, które tworzy host aplikacji, bez ingerencji w Bicep. Jest to możliwe przy użyciu interfejsów API PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) i PublishAsAzureContainerApp<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure,ContainerApp>) w przestrzeni nazw Aspire.Hosting.Azure.AppContainers
. Te metody umożliwiają dostosowanie definicji aplikacji kontenera Azure tworzonej przez hosta aplikacji.
Dodaj odwołanie do pakietu do pliku projektu:
<ItemGroup>
<PackageReference Include="Aspire.Hosting.Azure.AppContainers"
Version="9.0.0" />
</ItemGroup>
Na poniższym przykładzie pokazano, jak skalować aplikację kontenerową typu Azure do zera replik (0
):
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();
Powyższy przykład kodu odkłada generowanie definicji aplikacji kontenera Azure na hosta aplikacji. Dzięki temu można dostosować definicję aplikacji kontenera Azure bez konieczności uruchamiania azd infra synth
i niebezpiecznego modyfikowania wygenerowanych plików bicep.
Zobacz też
- .NET .NET Aspire konfiguracja i narzędzia
- .NET .NET Aspire zestaw SDK
- szablony .NET.NET Aspire
- .NET .NET Aspire omówienie orkiestracji
- Obsługa zdarzeń w .NET.NET Aspire
- Omówienie pulpitu nawigacyjnego .NET.NET Aspire
- Eksploruj .NET.NET Aspire pulpit nawigacyjny