.NET 7 Preview 6: Diese Neuigkeiten gibt es für Webentwickler

Die Preview bietet minimalistische Projektvorlagen, ein Blazor-Datengitter-Steuerelement und die JSON-Serialisierung lässt sich nun auch individuell anpassen.

Lesezeit: 8 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 16 Beiträge

(Bild: Ken Wolter/Shutterstock.com)

Von
  • Dr. Holger Schwichtenberg

Für Blazor liefert die am 12. Juli 2022 erschienene .NET 7.0 Preview 6 zwei neue Projektvorlagen: "Blazor Server App Empty" und "Blazor WebAssembly App Empty". Anders als die seit ASP.NET Core 3.x verfügbaren Blazor-Projektvorlagen enthalten die neuen "Empty"-Vorlagen nicht mehrere Webseiten und Bootstrap als CSS-Framework. Entwickler erhalten stattdessen eine einzige Webseite mit folgendem Inhalt:

@page "/"
<h1>Hello, world!</h1>

Die einzige mitgelieferte CSS-Datei /wwwroot/site.css enthält nur das notwendige CSS für den Informationskasten beim Auftreten eines Laufzeitfehlers. Auf eine Masterpage oder Navigationsleiste verzichten die neuen Vorlagen, die man über die gleichzeitig erschiene Preview 3.0 von Visual Studio 2022 Version 17.3 oder via Kommandozeile anlegt:

dotnet new blazorserver-empty
dotnet new blazorwasm-empty

Erstmals liefert Microsoft für Blazor ein Datengitter-Steuerelement – bisher mussten Blazor-Entwickler hierzu auf Drittanbieter oder Community-Lösungen ausweichen. Mit dem Namen "QuickGrid" möchte Microsoft offenbar betonen, dass man mit dem Steuerelement eine Performance-Grundlage für das Erstellen von Blazor-DataGrid-Komponenten anpeilt.

Das neue Steuerelement steckt im NuGet-Paket Microsoft.AspNetCore.Components.QuickGrid, ist aber vorerst experimentell. Eine Live-Demonstration mit Blazor WebAssembly ist auf GitHub in den QuickGridSamples verfügbar. QuickGrid bietet aber bisher weder eine Datenbearbeitung noch eine Verschachtelung von Zeilen. Auch das nachträgliche Umsortieren der Spalten durch den Benutzer ist nicht möglich.

Das NuGet-Paket Microsoft.AspNetCore.Components.CustomElements zum Erstellen von HTML Custom Elements (Web Components) ist ab Preview 6 nun ein offizieller Bestandteil von .NET 7.0. Das Paket gibt es schon seit .NET 6.0 RC1 gibt, aber bisher hatte es den Status "experimentell" innegehabt. Die zugehörige Dokumentation enthält weiterhin eine für experimentelle Features übliche Warnung: "Experimental features are provided for the purpose of exploring feature viability and may not ship in a stable version."

Eine weitere Neuerung in Blazor ist die Unterstützung diverser SHA-Algorithmen (SHA1, SHA256, SHA364, SHA512, jeweils inklusive HMAC-Variante) in Blazor WebAssembly direkt über die Schnittstelle SubtleCrypto der Web Crypto API in modernen Browsern. Bisher waren die SHA-Algorithmen in Blazor WebAssembly nur über die .NET-Implementierung erreichbar gewesen, die nun noch als Fallback zur Verfügung steht, wenn SubtleCrypto einmal nicht verfügbar ist. Bis zum Release von .NET 7 plant Microsoft, auf dem direkte Wege auch die Algorithmen AES-CBC, PBKDF2 und HKDF bereitzustellen.

In ASP.NET Core 7.0 Preview 6 hat Microsoft zwei neue Middleware-Komponenten ergänzt. Die neue Request-Decompression-Middleware verarbeitet HTTP-Anfragen mit Content-Encoding innerhalb von ASP.NET Core, sodass der Webserver sich nicht mehr darum kümmern muss. Entwicklerinnen und Entwickler können das in ASP.NET Core mit dem Aufruf von AddRequestDecompression() und UseRequestDecompression() in der Startphase aktivieren. Unterstützte Komprimierungsverfahren sind Brotli, Deflate und GZip. Andere Verfahren lassen sich mit der Schnittstelle IDecompressionProvider selbst implementieren.

Die ebenfalls neue Output-Caching-Middleware, zu aktivieren mit AddOutputCache() und UseOutputCache(), speichert das Ergebnis einer HTTP-Anfrage im Hauptspeicher, wenn die Methode CacheOutput() zum Einsatz kommt:

app.MapGet("/notcached", () => DateTime.Now.ToString());
app.MapGet("/cached", () => DateTime.Now.ToString()).CacheOutput();

Ein Caching abhängig von einem URL-Parameter, Header oder anderen Werten ist möglich via VaryByQuery(), [codeVaryByHeader()[/code] oder VaryByValue(), wie das folgende Beispiel zeigt:

app.MapGet("/cached", () => DateTime.Now.ToString()).CacheOutput(p => p.VaryByQuery("culture"));

Der in ASP.NET Core mitgelieferte plattformneutrale Webserver Kestrel unterstützt nun auch WebSockets über HTTP/2 statt nur über HTTP/1.1. Auch ASP.NET Core SignalR bietet in der Preview WebSockets über HTTP/2. Die Verhandlung der zu verwendenden HTTP-Version findet automatisch statt. Zu beachten ist, dass in Firefox dazu derzeit noch das Flag network.http.spdy.websockets zu setzen ist, während das bei Chrome und Edge schon im Standardmodus aktiviert ist.

Microsoft hat – wie laut GitHub am 13. April 2022 entschieden – das in früheren Previews eingeführte C#-Sprachfeature "Parameter Null Cheching" mit doppeltem Ausrufezeichen void Print(string s!!) { … } wieder aus dem C# 11-Compiler ausgebaut. Nun in .NET 7.0 Preview 6 kommt es beim Ausführen von !! zum Kompilerfehler "The 'parameter null-checking' feature is not supported". Microsoft hatte entschieden, den Parameter Null-Checking nicht zu unterstützen.

Die .NET-Basisklassenbibliothek bietet in Version .NET 7.0 Preview 6 Type Converter für die Daten in .NET 6.0 eingeführten Basisdatentypen System.DateOnly und System.TimeOnly. Ein Beispiel lautet wie folgt:

TypeConverter dateOnlyConverter = TypeDescriptor.GetConverter(typeof(DateOnly));
DateOnly? date = dateOnlyConverter.ConvertFromString("2022-07-13") as DateOnly?;

Laut Dokumentation soll es schon seit .NET 7.0 Preview 5 die 128-Bit langen Ganzzahltypen System.Int128 und System.UInt128 geben, die laut Blogeintrag nun in Preview 6 auch mit passenden Typkonvertern ausgestattet sind. Allerdings findet der Compiler in .NET 7.0 Preview 6 diese beiden 128-Bit-Datentypen noch nicht.

Das ist leider nicht das erste Mal, dass Microsoft Features anpreist, die noch gar nicht implementiert sind (siehe hierzu auch die Heise-Meldung zu Preview 4). Die im Blogeintrag zu Preview 4 angepriesenen Eigenschaften Microseconds und Nanoseconds gibt es auch in Preview 6 immer noch nicht.

Zudem gibt es in .NET 7 Preview 6 ein Regressionsproblem, das nicht in den Known Issues hinterlegt ist: Der in .NET 7 Preview 2 eingeführte Quellcodegenerator für reguläre Ausdrücke (RegexGenerator) erzeugt nun Programmcode, der nicht kompilierbar ist (s. Abb. 1).

Der per Annotation [RegexGenerator] vom Compiler generierte Programmcode kompiliert nicht in .NET 7.0 Preview 6 (Abb. 1)

Den JSON-Serializer System.Text.Json hat Microsoft in .NET 7 Preview 6 eine Anpassbarkeit der Serialisierung über sogenannte Type Info Resolver spendiert. So können Entwickler die Serialisierung und Deserialisierung anpassen, ohne den zu verarbeitenden Typ ändern zu müssen. Der Programmcode in Listing 1 sorgt dafür, dass bei der Klasse "Punkt" das Property "Memo" bei der Serialisierung und Deserialisierung ignoriert wird und die Koordination X und Y auch aus Zeichenketten wie "123" und "456" deserialisierbar sind. Folgendes Listing veranschaulicht die Anpassung der Serialisierung und Deserialisierung:

using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using ITVisions;
 
namespace NET7Console;
 
public class Punkt
{
 public int X { get; set; }
 public int Y { get; set; }
 public string Memo { get; set; } = "?";
}
 
 
internal class FCL_JSON
{
 public static void Run()
 {

  JsonSerializerOptions options = new()
  {
   TypeInfoResolver = new DefaultJsonTypeInfoResolver()
   {
    Modifiers =
        {
            (JsonTypeInfo jsonTypeInfo) =>
            {
 
             // Ignoriere alle Properties, die mit "Memo" beginnen
            var memoProp = jsonTypeInfo.Properties.FirstOrDefault(p=>p.Name.StartsWith("Memo"));
            if (memoProp != null)
             {
              jsonTypeInfo.Properties.Remove(memoProp);
             }
            
 
            // Erlaube Zahlen aus Zeichenketten zu deserialisieren
            if (jsonTypeInfo.Type == typeof(int))
            {
                    jsonTypeInfo.NumberHandling = JsonNumberHandling.AllowReadingFromString;
 
            }
            }
 
        }
   }
  };
 
  Punkt point = JsonSerializer.Deserialize<Punkt>(@"{""X"":""123"",""Y"":""456"",""Memo"":""Testposition""}", options);
  Console.WriteLine($"({point.X},{point.Y},{point.Memo})"); // (123,456,?)
 
 }
 
}

Autoren von .NET-Projektvorlagen können nun mit "Constraints" in der Datei template.json Voraussetzungen für die Verwendung der Vorlagen festlegen, so unter anderem Abhängigkeiten vom Betriebssystem, Template Host (CLI oder Visual Studio bzw. Visual Studio for Mac), von der jeweiligen .NET-SDK-Version und den installierten .NET-SDK-Workloads. Zur Verdeutlichung dient folgendes Code-Listing:

"constraints": {
    "windows-only": { // Custom name - not validate
      "type": "os", // Type of the constraint - used to match to proper Constraint component to evaluate the constraint
      "args": "Windows" // Arguments passed to the evaluating constraint component
    },
   "7-Preview": {
           "type": "sdk-version",
           "args": "7.*.*-*"
       }
  }

Die Constraints werden aber bisher nur in der .NET SDK CLI, nicht in Visual Studio geprüft. Zudem gibt es nun Multi-Choice-Parameter beim Anlegen von Projekten und verbesserte Fehlermeldungen.

Im objektrelationalen Mapper Entity Framework Core hat Microsoft sich in Version .NET 7.0 Preview 6 (genaue Versionsnummer auf NuGet.org: 7.0.0-preview.6.22329.4) abermals mit der Leistungsoptimierung beschäftigt. Drei Punkte sind optimiert:

  1. Verzicht auf eine Transaktion, wenn SaveChanges() nur einen einzigen SQL-Befehl sendet.
  2. Schnelleres Einfügen mehrerer Datensätze im SQL Server (siehe Tabelle).
  3. Zusammenfassen von Befehlen beim Einfügen abhängiger Datensätzen
Method Entity Framework Core-Version Server Mean Error StdDev
Insert_four_rows 6.0 Remote 12.93 ms 0.258 ms 0.651 ms
Insert_four_rows 7.0 Remote 4.99 ms 0.098 ms 0.198 ms

Tabelle 1: Leistungssteigerung beim Einfügen mehrerer Datensätze im SQL Server in Entity Framework Core 7.0 Preview 6 (Quelle: Microsoft)

Die fertige Version von .NET 7.0 ist für den 8. November 2022 angekündigt. Der Support für diese Version soll bis zum Mai 2024 laufen. Heise und die .NET-Experten von IT-Visions werden .NET 7 in einem eintägigen Online-Event am 22. November 2022 präsentieren.

Heise und IT-Visions präsentieren .NET 7 – Online-Event

(sih)