Freigeben über


ConfigurationBinder überspringt im Hintergrund ungültige Arrayelemente

Ab .NET 8 überspringt ConfigurationBinder stillschweigend Array- und Listenelemente, deren Werte nicht in den Zieltyp konvertiert werden können. Zuvor wurden fehlgeschlagene Elemente als null Platzhalter beibehalten, und die resultierende Auflistung behält die gleiche Länge wie die Anzahl der Elemente in der Konfigurationsquelle bei.

Eingeführt in Version

.NET 8

Bisheriges Verhalten

Zuvor wurde beim Binden einer Array- oder Listeneigenschaft über Get<T>(IConfiguration) oder Bind(IConfiguration, Object) ein Element, dessen Wert nicht in den Zieltyp konvertiert werden konnte, als null-Platzhalter im Ergebnis beibehalten. Die Sammlungslänge entspricht der Anzahl der Elemente in der Konfiguration.

// Configuration source, for example, appsettings.json:
// "Items": [
//   { "Name": "A", "Interval": 10 },
//   { "Name": "B", "Interval": "a" }   <-- invalid int
// ]

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 6/7 result:
// settings.Length == 2
// settings[0] = { Name = "A", Interval = 10 }
// settings[1] = null   (conversion failed, placeholder preserved)

Neues Verhalten

Ab .NET 8 werden Elemente, bei denen die Typkonvertierung fehlschlägt, im Hintergrund übersprungen. Die resultierende Auflistung enthält nur erfolgreich gebundene Elemente und hat eine kürzere Länge als die Anzahl der Einträge in der Konfigurationsquelle.

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Die interne Implementierung von ConfigurationBinder wurde in .NET 8 umgestaltet. Anstatt die Bindungselemente in das Zielarray vorab zuzuordnen (was bei einem Konvertierungsfehler null hinterlässt), sammelt der Binder nun nur die erfolgreich gebundenen Elemente in einer temporären Liste, bevor das endgültige Array erstellt wird.

Das vorherige Verhalten war auch für Werttypen wie int[]z. B. problematisch. Für einen ungültigen Konfigurationswert würde der Binder 0 speichern, wodurch er nicht von einem legitimen Wert von 0 zu unterscheiden war. Das neue Verhalten vermeidet diese Mehrdeutigkeit.

  • Aktivieren Sie ErrorOnUnknownConfiguration während der Entwicklung , um ungültige Konfigurationswerte sofort anzuzeigen, anstatt Elemente im Hintergrund zu löschen:

    var settings = configuration.GetSection("Items").Get<MyItem[]>(options =>
        options.ErrorOnUnknownConfiguration = true);
    

    Ab .NET 8 bewirkt diese Option ebenfalls, dass ConfigurationBinder eine InvalidOperationException auslöst, wenn ein Wert nicht in den Zieltyp konvertiert werden kann. Weitere Informationen finden Sie unter ConfigurationBinder-Throws für falsch übereinstimmende Werte.

  • Korrigieren Sie ungültige Konfigurationswerte. Stellen Sie sicher, dass alle Werte in Ihrer Konfigurationsquelle den erwarteten Typen für das gebundene Modell entsprechen.

  • Überprüfen Sie die Länge der Sammlung nach der Bindung, wenn Ihr Code von der Anzahl der Elemente abhängt, die der Konfigurationsquelle entsprechen.

  • Verwenden Sie Zeichenfolgeneigenschaften mit manueller Analyse , wenn Sie unkonvertierbare Werte ordnungsgemäß behandeln und alle Arrayeinträge beibehalten müssen.

Betroffene APIs