Microsoft: Weitere Pakete und Pläne für .NET 8.0 auf der Build 2023

Microsoft hat Erweiterungen für Skalierbarkeit und Hochverfügbarkeit bei .NET 8.0 sowie Änderungen bei der Authentifizierung in ASP.NET Core bekanntgegeben.

In Pocket speichern vorlesen Druckansicht 6 Kommentare lesen

(Bild: Shutterstock)

Lesezeit: 8 Min.
Von
  • Dr. Holger Schwichtenberg
Inhaltsverzeichnis

Von .NET 8.0 sind derzeit die ersten vier Preview-Versionen verfügbar. Obwohl es bisher die Regel war, ist im Rahmen der Build-Konferenz 2023 keine neue Version erschienen. Die aktuelle Preview 4 stand jedoch schon eine Woche vor der Konferenz bereit. Auf der Build-Konferenz gab es jedoch über die bisher veröffentlichten Preview-Versionen hinaus einige Ankündigungen für die in den nächsten Monaten kommenden Vorabversionen bis zum geplanten Erscheinungstermin im November 2023. So soll nun auch Blazor WebAssembly endlich echtes Multithreading erhalten.

Nachdem die Preview-Version 4 bereits Mitte Mai vorgestellt wurde, gehörte es nun zu den wichtigsten Ankündigungen für .NET-Entwickler auf der Build-Konferenz, dass Microsoft in ASP.NET Core die Integration von Duende Identity Server in seinen Projektvorlagen entfernen wird. Es wird es allerdings weiterhin möglich sein, dass Entwickler und Entwicklerinnen eine Anbindung an Identity Server oder andere OIDC-kompatible Authentifizierungsserver selbst hinzufügen.

Der Hintergrund dieses Schrittes besteht darin, dass der Identity Server in den Versionen 1 bis 4 eine Open-Source-Software und ein Projekt der gemeinnützigen .NET Foundation war. Im Oktober 2020 hatten Dominick Baier und Brock Allen die Software unter dem Firmennamen Duende auf ein kommerzielles Modell umgestellt. Nur Open-Source-Projekte sind dabei von den Lizenzgebühren ausgenommen. Zudem hat Microsoft angekündigt, die Verwendung von eigenen, anwendungsspezifischen Authentifizierungstoken ohne zentralen OIDC-kompatiblen Authentifizierungsserver in ASP.NET Core 8.0 zu vereinfachen.

Heise-Konferenz: betterCode() .NET 8.0
betterCode() .NET 8.0, Online-Konferenz, 21. November 2023

Mit .NET 8.0 erscheint die nächste Long-Time-Support-Version. Am 21. November 2023 bietet die von Heise und www.IT-Visions.de präsentierte Online-Konferenz betterCode() .NET 8.0 das Rüstzeug, sich einen grundlegenden Überblick zu .NET 8.0 zu verschaffen. Die Expertenvorträge zeigen die Neuerungen in .NET 8.0, ASP.NET Core 8.0, Blazor 8.0, .NET MAUI, C# 12.0 und mehr. Vier ganztägige Workshops vermitteln Hands-on-Wissen.

Im Vortrag "Cloud-native development with .NET 8" zeigte Brady Gaster, Principal Program Manager bei Microsoft, ein neues Paket Microsoft.Extensions.Http.Resilience, von dem es seit dem 23. Mai 2023 eine erste Version 8.0.0-preview.4.23273.7 auf NuGet.org gibt, die aber nicht Bestandteil von .NET 8.0 Preview 4 war. Mit diesem Paket können Entwicklerinnen und Entwickler AddStandardResilienceHandler() sowohl bei der Nutzung von gRPC- als auch von WebAPI-Diensten in Verbindung mit AddGrpcClient() und AddHttpClient() aufrufen. In der neuen Methode AddStandardResilienceHandler() gibt es zahlreiche Einstellungen für das Verhalten bei vorübergehenden Fehlerfällen wie beispielsweise Timeout, Wiederholungsanzahl, Ratenbegrenzung und Fallback. Der in Listing 1 gezeigte Ausschnitt aus einem ASP.NET-Core-8.0-Projekt zeigt entsprechende Beispiele.

// WebAPI-Dienst mit Standard-Resilienz-Einstellungen
builder.Services.AddHttpClient<OrderServiceClient>(c =>
{
 var url = builder.Configuration["ORDERS_URL"] ?? throw new InvalidOperationException("ORDERS_URL is not set");
 
 c.BaseAddress = new(url);
})
.AddStandardResilienceHandler();

// gRPC-Dienst mit angepassten Resilienz-Einstellungen
builder.Services.AddGrpcClient<Products.Products.ProductsClient>(c =>
{
 var backendUrl = builder.Configuration["PRODUCTS_URL"] ?? throw new InvalidOperationException("PRODUCTS_URL is not set");
 
 c.Address = new(backendUrl);
})
.AddStandardResilienceHandler(
 x =>
 {
  x.RetryOptions = new HttpRetryPolicyOptions() { BackoffType = BackoffType.Linear, RetryCount = 3, ShouldRetryAfterHeader = true };
  x.AttemptTimeoutOptions = new HttpTimeoutPolicyOptions() { TimeoutStrategy = TimeoutStrategy.Optimistic, TimeoutInterval = TimeSpan.FromSeconds(5) };
  x.CircuitBreakerOptions = new HttpCircuitBreakerPolicyOptions() { FailureThreshold = 0.5, BreakDuration = TimeSpan.FromSeconds(4), SamplingDuration = TimeSpan.FromSeconds(15) };
  x.TotalRequestTimeoutOptions = new HttpTimeoutPolicyOptions() { TimeoutStrategy = TimeoutStrategy.Optimistic, OnTimedOutAsync = (x) => Log(x) };
 }
 );


Listing 1: WebAPI-Dienst mit Standard-Resilienz-Einstellungen

Das neue Paket Microsoft.Extensions.Http.Resilience basiert auf Polly, einer etablierten .NET-Bibliothek für Ausfallsicherheit und für den Umgang mit Fehlersituationen. Die erste Version von Polly ist bereits im Jahr 2013 für das klassische .NET Framework erschienen. Zudem kündigte der Vortrag von Brady Gaster einige Erweiterungen der Implementierung des OpenTelemetry Protocol (OTLP) in .NET an.

Erweiterungen für Skalierbarkeit und Hochverfügbarkeit in ASP.NET Core 8.0, wie sie im Vortrag von Brady Gaster angekündigt wurden.

(Bild: Microsoft)

Microsoft hat OTLP erstmals in .NET 7.0 eingeführt. Mit den neuen Funktionen werde die Integration in Überwachungssoftware wie Prometheus inklusive Grafana sowie das Tracing mit Jaeger und Zipkin sowie Cloud-Anwendungen für das Application Performance Monitoring (APM) wie Application Insights, AWS Cloud Watch und Google Cloud Monitoring leichter.

Integration von .NET-8.0-Anwendungen in OTLP-fähige Software.

(Bild: Microsoft)

Alle genannten Pakete wie Microsoft.Extensions.Telemetry und Microsoft.Extensions.Compliance.Redaction sind erstmals am 23. Mai 2023 auf NuGet.org veröffentlicht worden. Die neuen Telemetrie-Pakete basieren auf dem bestehenden OpenTelemetry SDK für .NET.

Die im Vortrag gezeigte Beispielanwendung finden Entwicklerinnen und Entwickler auf GitHub. Während hier das neue Paket Microsoft.Extensions.Http.Resilience bereits verwendet wird, kommt im Beispiel für die Telemetrie noch das OpenTelemetry SDK (Paketnamen OpenTelemetry.*) für .NET zum Einsatz. Ein Beispiel für den Einsatz der neuen Pakete (Microsoft.Extensions.Telemetry.* und Microsoft.Extensions.Compliance.*) ist bisher nicht enthalten.

Für den Ahead-of-Time-Compiler ("Native AOT"), den Microsoft in .NET 7.0 zunächst nur für Konsolenanwendungen eingeführt hatte und in .NET 8.0 auf Webservices mit gRPC und Minimal WebAPIs ausdehnen wird, zeigte Microsoft neue Zahlen zum Stand der Verbesserungen bei der Größe des Kompilats, RAM-Bedarf und Startzeit.

Messwerte für einen WebAPI-Dienst mit .NET 8.0 mit Just-in-Time-Compiler.

(Bild: Microsoft)

Nur die Leistung zur Laufzeit, gemessen in Requests per Second (RPS), verbessert sich unter Linux gering und unter Windows wird sie derzeit sogar etwas schlechter durch die AOT-Kompilierung.

Messwerte für den im vorherigen Bild gezeigten WebAPI-Dienst mit Native-AOT-Kompilierung.

(Bild: Microsoft)

.NET-Softwarearchitekt Damian Edwards erläuterte im Vortrag "Deep dive into .NET performance and native AOT", dass beim Datenzugriff bisher nur der Zugriff via ADO.NET (also via Command- und DataReader-Objekte) sowie sein experimenteller Objekt-relationaler Mapper "NanORM" unterstützt werden.

Für den etablierten Objekt-relationalen Mapper Entity Framework Core ist es wohl noch ein längerer Weg, um AOT-fähig zu werden. NanORM funktioniert ähnlich wie Dapper von StackExchange. Das bedeutet, das Entwicklerteams für die Abfragen SQL und nicht LINQ wie bei Entity Framework Core verwenden, zum Beispiel:

using var db = new SqliteConnection(connectionString);
var todos = db.QueryAsync<Todo>("SELECT * FROM Todos");
var todosList = new List<Todo>();

Dabei ist QueryAsync<T> eine Erweiterungsmethode auf der Klasse Microsoft.Data.Sqlite.SqliteConnection. Auch zum Einfügen, Ändern und Löschen von Datensätzen verwenden Entwickler und Entwicklerinnen dann die SQL-Syntax in einer Zeichenkette, wie in Listing 2 zu sehen.

var todo = new Todo { Title = title };
var createdTodo = await db.QuerySingleAsync<Todo>("""
        INSERT INTO Todos(Title, IsComplete)
        Values(@Title, @IsComplete)
        RETURNING *
        """,
        todo.Title.AsDbParameter(),
        todo.IsComplete.AsDbParameter());


Listing 2: Zum Einfügen, Ändern und Löschen von Datensätzen verwenden Entwickler und Entwicklerinnen die SQL-Syntax in einer Zeichenkette.

Damit bietet NanORM deutlich weniger Datenbankmanagementsystem-Abstraktion, Entwicklungskomfort und Robustheit als Entity Framework Core.

In Blazor 8.0 wird Multithreading in Blazor WebAssembly in Form von durch Entwicklerinnen und Entwickler selbst erstellten Threads möglich sein. Seit .NET 7.0 gibt es nur experimentelle Unterstützung im .NET WASM SDK und nur für .NET-Code, der im Browser auf Basis von WebAssembly, aber ohne Blazor-Framework läuft. Die Arbeiten daran laufen und können auf GitHub verfolgt werden. Microsoft ist noch damit beschäftigt, das SDK für .NET WebAssembly und das .NET WASM SDK anzugleichen. In .NET 8.0 will Microsoft zudem das Hot Reloading von Blazor-Anwendungen zur Entwicklungszeit verbessern.

Microsoft präsentierte auf der Build erneut das bereits im Januar 2023 angekündigte Blazor United, das Progressive Enhancements für eine moderne Webanwendung bieten soll. Eine Blazor-United-Webanwendung kann zunächst rein serverseitig gerendert werden, dann im Hintergrund zu Blazor Server mit Interaktivität per Websocket-Verbindung und schließlich zur rein clientseitigen Ausführung mit Blazor WebAssembly übergehen, sobald die kompletten .NET-Assemblies im Browser geladen sind. Die Vorführung von Blazor United war eindrucksvoll und scheint als Lösung für die bisher schwierige Wahl zwischen Blazor Server und Blazor WebAssembly geeignet. Allerdings gibt es Blazor United weiterhin nur als Prototyp und noch nicht als Teil der .NET 8.0 Previews.

Insgesamt war .NET auf der diesjährigen Build-Konferenz mit nur sechs Vorträgen aus dem .NET-Entwicklungsteam weniger stark vertreten als in den vergangenen Jahren. Dabei handelt es sich um die folgenden Vorträge:

Die Vorträge lassen sich nun auch im Nachhinein auf YouTube kostenfrei betrachten.

(fms)