Das sind die Überarbeitungen von .NET Core, ASP.NET Core und Entity Framework Core in Version 2.1

Microsoft hatte die Veröffentlichung für den Sommer 2018 angekündigt. Nun scheint der Sommer auch in den USA schon früh begonnen zu haben, denn die 2.1-Versionen von Microsofts Core-Produkten sind schon zum 31. Mai erschienen und bieten viele Neuerungen.

Werkzeuge  –  0 Kommentare
.NET Core, ASP.NET Core und Entity Framework Core 2.1 sind fertig

Wie üblich hat Microsoft am gleichen Tag nicht nur die Laufzeitumgebung .NET Core, sondern auch das Webserverframework ASP.NET Core und den objekt-relationalen Mapper Entity Framework Core in einer neuen Version 2.1 veröffentlicht. Neun Monate sind vergangen seit dem Erscheinen der 2.0-Versionen – das ist relativ lang, verglichen mit den fünf Monaten zwischen Version 1.0 und 1.1. Der Zeitraum drückt aber aus, dass Microsoft in die Version 2.1 sehr viele Neuerungen einbringt. Nach dem Prinzip des Semantic Versioning repräsentiert die Versionsnummernänderung zwischen 2.0 und 2.1 nicht den Umfang der Neuerungen, sondern die vorhandene Kompatibilität. Bestehende .NET-Core-2.0-Anwendungen sollen auf .NET Core 2.1 ohne Änderungen laufen können, verspricht Microsoft in einem Blogeintrag mit dem "Minor-Version Roll-forward". Für .NET-Core-1.x-Anwendungen gilt dies aber nicht.

Version 2.1 wird bald LTS-Version

Die Version 2.1 will Microsoft in den kommenden zwei bis drei Monaten – nach einigen kleineren Updates – als neue Long-Term-Support-Version (LTS) deklarieren. Langzeit ist aber relativ: Während Microsoft auf das klassische .NET Framework zehn Jahre Support gab, bedeutet Langzeit bei .NET Core nur drei Jahre. Wichtig ist aber, dass mit dieser bald kommenden Erklärung der "LTS"-Version dann alle Anwender der Version 2.0 schnell umsteigen müssen, denn die Version 2.0 ist ein "Current"-Release, dessen Support 12 Monate nach dem LTS-Release enden wird. Der Support für .NET Core 1.0 und 1.1 endet sowieso am 27. Juni 2019.

Schnelleres Kompilieren und Ausführen

Laut Microsoft lag der Fokus von .NET Core 1.1 auf der Erhöhung der Übersetzungsgeschwindigkeit (s. Abb. 1). Auch der Just-in-Time-Compiler sowie die Netzwerk-Bibliotheken (u.a. die Klasse System.Net.HttpClient) hat das Entwicklungsteam erheblich überarbeitet, was der Laufzeitperformance von .NET Core-Anwendungen zu Gute kommt. Die angekündigte "Tiered Compilation", durch die der Just-In-Time-Compiler zunächst den Fokus auf schnelle Übersetzung statt optimalem Ergebnis legt und dann für häufiger verwendete Methoden die Übersetzung nachträglich optimiert, ist aber nur in einer Vorschau-Version enthalten. Diese Funktion muss der .NET-Core-2.1-Nutzer explizit durch das Setzen einer Umgebungsvariablen aktivieren, die kurioserweise noch "COMPlus" im Namen trägt – das war der Name, den der Vorläufer von .NET Ende der 1990er Jahre trug: COMPlus_TieredCompilation="1".

Schnellere Übersetzung bei .NET Core 2.1 (Bild: Microsoft)

.NET Core 2.1 unterstützt nun auch die Brotli-Komprimierung nach RFC 7932. Mit der Unterstützung der Datenstrukturen Span<T>, ReadOnlySpan<T>, Memory<T> und ReadOnlyMemory<T>, die ein direktes Adressieren von Teilen von Arrays und anderen Speicherbereichen ermöglichen, können Entwickler zudem die Bearbeitung großer Datenstrukturen optimieren.

Mehr Plattformen, Werkzeuge und Klassen

.NET Core 2.1 unterstützt als Betriebssysteme neben Windows, macOS, RHEL, Fedora, Debian, SLES und openSuse auch Ubuntu und Alpine Linux, die aktuelle Ubuntu-LTS-Version 18.04 sowie Raspberry Pi 2+ mit ARM-v7- oder -v8-Chips. Das Kommandozeilenwerkzeug dotnet bietet jetzt auch globale Werkzeuge, wie man sie aus Node.js und npm kennt. Nach der Installation solcher Werkzeuge mit dotnet tool install -g abc können Entwickler nicht nur über dotnet abc, sondern auch über die Eingabe abc die Werkzeuge direkt starten.

Die umfangreichste funktionale Verbesserung in .NET Core 2.1 ist die Verfügbarkeit des Windows Compatibility Pack for.NET Core, das viele Klassen aus dem alten .NET Framework 4.x in die .NET-Core-Welt portiert. Dazu gehören zum Beispiel Klassen für den Registry-Zugriff, Datenbankzugriffe per ODBC, LINQ für DataSets, das Code Document Object Model (CodeDOM), Zugriff auf serielle Ports und LDAP-Server wie das Active Directory sowie die sehr umfangreiche Windows Management Instrumentation (WMI), mit der man Informationen aus dem Betriebssystem auslesen und verändern kann. Zu beachten ist aber, dass einige dieser Bibliotheken nur auf Windows laufen und daher nur dann eingesetzt werden können, wenn eine .NET-Core-Anwendung nicht plattformneutral sein muss, sondern der ausschließliche Betrieb auf Windows benötigt wird.

Lückenschluss in Entity Framework Core

Bei Entity Framework Core schließt Microsoft vier gravierende Schwächen, die die Core-Variante bisher noch gegenüber dem klassischen ADO.NET Entity Framework hatte. Zum einen werden mit dem LINQ-Operator GroupBy deklarierte Gruppierungen nun tatsächlich zur Datenbank gesendet und nicht mehr im RAM ausgeführt, was bisher gerade bei großen Datenmengen zu einer inakzeptablen Ausführungsgeschwindigkeit führte. Zum anderen bietet Entity Framework Core nun auch das aus dem Vorgänger bekannte automatische Lazy Loading verbundener Datensätze wieder an. Es ist aber nicht mehr wie im Vorgänger automatisch aktiv, sondern muss von Entwicklern explizit eingeschaltet werden, um das unbewusste Nachladen von Daten in Schleifen zu verhindern, was im klassischen Entity Framework oft zu Leistungsproblemen führte. Entwickler können in Entity Framework Core zwischen Lazy Loading mit automatisch generierten Runtime Proxies oder einer vom ORM-Mapper unterstützten Lösung mit eigenen Ergänzungen der Entitätsklasse wählen.

Drittens gibt es nun auch Unterstützung für "ambiente Transactions" mit System.Transactions.TransactionScope, was die Programmierung von Transaktionen über zahlreiche Datenbankoperationen hinweg sehr vereinfacht. Durch den vierten Lückenschluss ist es jetzt wieder möglich, beliebige Resultsets auf Nicht-Entitätstypen abzubilden. Damit können Entwickler Datenbank-Views, Tabellen ohne Primärschlüssel und Ergebnisse von SQL-Befehlen, Stored Procedures und Table Value Functions nutzen, auch wenn deren Resultset nicht der Struktur einer bestehenden Tabelle entspricht.

Darüber hinaus enthält Entity Framework Core auch ganz neue Funktionen: Die neu eingeführten Value Converters erlauben Wertkonvertierung beim Materialisieren und Speichern von Objekten. Der im Februar angekündigte Microsoft-Treiber für CosmoDB steckt weiterhin in den Kinderschuhen. Nutzer von Drittanbietertreibern (z.B. für Oracle oder MySQL) müssen aktuelle Treiber von dem Hersteller beziehen, da die bestehenden Treiber für Entity Framework Core 2.0 nur bedingt kompatibel zu Entity Framework Core 2.1 sind.

Mehr Kapselung in ASP.NET Core 2.1

Beim Anlegen eines neuen Webprojekts mit ASP.NET 2.1 in Visual Studio 2017 (Version 15.7) oder dem Kommandozeilenwerkzeug "dotnet new" fällt sofort auf, dass viel weniger Webseiten als bisher angelegt werden: Alle Seiten für die Benutzeranmeldung und Benutzerverwaltung fehlen. Dennoch ist beim Start der Anwendung diese Funktionalität vorhanden. Microsoft hat diese Funktionen in eine DLL (Microsoft.AspNetCore.Identity.UI.dll) gekapselt. Im generierten Programmcode findet man lediglich unter /Area/Identity/Pages/_ViewStart.cshtml eine Konfiguration, welche auf der Layoutseite als Master Page zum Einsatz kommen soll. Entwickler, denen die Anpassungsfähigkeiten über die Layoutseite nicht reichen, können sich dann aber die einzelnen Webseiten herausgenerieren lassen (per Funktion in Visual Studio: Add Scaffold | Identity) und sie manuell wie bisher bearbeiten. Zu beachten ist aber, dass die generierten Seiten dann immer das Model der sogenannten "Razor Pages" nutzen, auch wenn man ein Projekt mit dem Model-View-Controller-Framework angelegt hatte. Razor Pages wurden in ASP.NET Core 2.0 eingeführt und sind das neue von Microsoft favorisierte Entwicklungsmodell für Server Side Rendering.

Mit "Areas" können Entwickler innerhalb eines Projekts die Seiten organisatorisch trennen. Jede Area kann ihr eigenes "/Shared"-Verzeichnis besitzen. Microsoft vereinfacht die Datenbindung in Razor Pages, indem die Annotation [BindPropertyAttribute] zentral auf eine Page-Model-Klasse anwendbar ist. Mit der Schnittstelle IPageFilter können Entwickler eigene Logik nun vor und nach dem Razor Page Handler ausführen. Die neuen Projektvorlagen für ASP.NET Core unterstützen zudem im Standard das Einholen des Benutzereinverständnisses für Cookies gemäß DSGVO. Cookies, die nicht als "Essential" markiert sind, werden automatisch unterdrückt, wenn Benutzer ihr Einverständnis zu Cookies verweigern.

Für ASP.NET-Core-basierte Web-APIs bietet Microsoft mit der Controller-Annotation [ApiController] mehr Automatismen bezüglich Parameterbindung und Validierung. So sucht ASP.NET Core komplexe Typen wieder im Standard im Inhalt der HTTP-Nachricht statt im Query String. Wenn Validierungen fehlschlagen und dadurch der Model State ungültig ist, liefert die Web-API nun automatisch den Fehler 400 ("Bad Request") zurück. Die neue Klasse ActionResult<T> erlaubt das individuelle Setzen von HTTP-Statuscodes und gleichzeitig die Rückgabe eines typisierten Objekts für den Inhalt der Antwort. Damit wird die Generierung von Swagger-OpenAPI-Dokumentationen vereinfacht. Beim untypisierten ActionResult mussten Entwickler bisher Swagger per zusätzlicher Annotation über den Ergebnistyp informieren. Zudem unterstützt Microsoft nun die Übermittlung von Problemdetails nach RFC 7808.

Zwei der im Februar 2018 angekündigten Funktionen werden die Entwickler jedoch nicht in ASP.NET Core 2.1 finden. Zum einen fehlt die schnellere In-Process-Integration in den Microsoft-Webserver Internet Information Services (IIS), das heißt, alle Verarbeitungsschritte von ASP.NET Core 2.1 laufen auch im IIS weiterhin in einem eigenen Prozess. Zum zweiten verbleibt die Portierung der WebHooks-Bibliothek von klassischen ASP.NET auf ASP.NET Core im Preview-Status. In beiden Fällen begründet Microsoft die Streichung damit, dass man den beiden Funktionen nicht genügend Aufmerksamkeit geschenkt habe.

ASP.NET Core SignalR, Microsofts Framework für bi-direktionale Kommunikation zwischen Webserver und Browser, ist nun in einer Version 1.0 als Zusatz zu ASP.NET Core 2.1 verfügbar.

Verfügbarkeit

.NET Core 2.1 inklusive ASP.NET Core 2.1 und Entity Framework Core 2.1 gibt es als Download auf der Microsoft-Website als Laufzeit- oder SDK-Version. Entity Framework Core 2.1 kann man auch einzeln über NuGet beziehen durch Einbindung des entsprechenden Datenbanktreibers (z.B. für Microsoft SQL Server oder SQLite). ASP.NET Core gibt es bei NuGet neben dem bisherigen allumfassenden Meta-Paket Microsoft.AspNetCore.All und auch in reduzierter Form mit dem neuen Meta-Paket Microsoft.AspNetCore.App. In diesem App-Paket fehlen einige Pakete wie die SQLite-Unterstützung für Entity Framework Core, die man in einer Webanwendung eher selten braucht.