Überblick ASP.NET 7

Einführung in ASP.NET 7

ASP.NET 7 ist die neueste Version des ASP.NET-Webentwicklungs-Frameworks von Microsoft. Erschienen am 08. November 2022 stellt es eine Weiterentwicklung der Version ASP.NET 6 dar. Diese neue Version bringt viele Verbesserungen für den Entwicklungsprozess, wie z.B. eine mehr Performance und Unterstützung für moderne Webstandards. Jedoch sollte man beachten, dass diese Version standard-term support (STS) hat. Das bedeutet, im Gegensatz zu ASP.NET 6, wird diese Version nur 18 Monate nach dem Erscheinen supported.

Was ist neu in ASP.NET 7 ?

In der Version 7 von ASP.NET ging es vor allem um das Thema Performance. Alle neuen Features, aber auch bereits vorhandene Features, wurden mit dem Gedanken erstellt, die Performance maßgeblich zu verbessern. So wurden neben einer deutlich verbesserten Programmcode Erzeugung auf der Plattform Arm64 auch das On-stack replacement (OSR) hinzugefügt, welches dem Entwickler erlaubt, den Programmcode innerhalb einer gerade ausgeführten Funktion live zu tauschen. Aber auch die Erstellung von nativem Programmcode hat einen großen Schritt nach vorn gemacht mit Native AOT.

Ferner wurde auch die bereits relativ gute Performance von HTTP/2 noch weiter verbessert sowie mit UseRateLimiter eine integrierte Middleware eingeführt, die den Datenverkehr begrenzen kann. Beide Schritte tragen maßgeblich zu performanteren Anwendungen bei.

gRPC JSON transcoding

Aber nicht nur die Performance wurde verbessert. Es gab auch einige andere erwähnenswerte Erweiterungen und Neuerunen innerhalb des ASP.NET 7 Frameworks. gRPC unterstützt jetzt auch Transkodierung in das JSON Format. Dies ermöglicht dem Client wahlweise mit gRPC oder REST auf den jeweiligen Dienst zu zu greifen. Eine Verdopplung der Implementierung auf der Server Seite ist nicht länger erforderlich.

to Program.Main or not to Program.Main

Mit ASP.NET 6 wurde die Möglichkeit eingeführt, dass sogenannte top-level-statements ohne eine Program.Main Funktion direkt in der Datei geschrieben wurden. Dieser neue Standard wurde gemischt aufgenommen. Zwar ist dieses Programmiermodell immer noch Standard, aber mit Hilfe des Parameters --use-program-main kann bei der Erstellung des Projektes entschieden werden, ob mit oder ohne Main Methode entwickelt werden soll.

OpenAPI Verbesserung für Routing basierte API’s

Bisher wurde die Beschreibung für das zu erstellende OpenAPI Dokument ausschließlich über Attribute hinzugefügt. Dies machte es schwierig und kompliziert eine integrierte Dokumentation für eine solchen Dienst zu erstellen.

/// mit ASP.NET 6 
app.MapGet("/hello-aspnet-6", 
  [SwaggerOperation(Tags = new[] { "MyTag" })]
  () => "Hello world"
);

/// ab ASP.NET 7
app.MapGet("/hello-aspnet-7", () => "Welcome to the future").WithOpenApi();

Dazu kommen der neue generische Type Results<TResult1, TResult2, TResultN> sowie die Funktion TypedResults. Diese beiden Erweiterungen ermöglichen zusammen, dass alle möglichen Rückgabetypen mit Hilfe der Fluent API an OpenAPI übergeben werden können, ohne dass zusätzliche Attribute erforderlich sind.

app.MapGet("/todos/{id}", async Results<Ok<Todo>, NotFound> (int id, TodoDb db)
{
    return await db.Todos.FindAsync(id) is Todo todo
        ? TypedResults.Ok(todo)
        : TypedResults.NotFound();
});

System.Text.Json

Die Implementierung des JSON-Serializer wurde grundlegend überarbeit und auf Performance optimiert. War doch die Empfehlung bisher eher Newtonsoft.Json zu verwenden so lässt sich spätestens ab der Version ASP.NET 7 sagen, dass die integrierte Serialisierung dieser Bibliothek in keinem Punkt mehr nachsteht. Solange keine erweiterten Funktionen wie z.B. JsonPath, MissingMemberHandling oder DateTimeZoneHandling benötigt werden. Lautet die Empfehlung jetzt lieber direkt System.Text.Json zu verwenden.

Operator constraints

Bei der Entwicklung von modernen Anwendungen wird immer häufiger die Möglichkeit der Implementierung generischer mathematischer Algorithmen benötigt. Bisher war es in C# nicht möglich Operator constraints zu verwenden. Was zu einer komplizierteren oder teilweise sogar nicht möglichen Implementierung führte. Dies ist ab der Version 11 von C# (endlich) möglich:

static T Add<T>(T left, T right)
    where T : INumber<T>
{
    return left + right;
}

Weitere Neuerungen

Darüber hinaus wurde die Implementierung der Regex-Bibliothek grundlegend überarbeitet und um neue FFunktionen erweitert. Es sind Route groups für route-basierte APIs dazugekommen sowie die Möglichkeit die Anwendung direkt als Container zu veröffentlichen.