Leere Zeichenfolgen in verketteter Konfiguration setzen frühere Anbieter außer Kraft

Ab .NET 11 behandelt eine mit AddConfiguration hinzugefügte Konfiguration eine leere Zeichenfolge als vorhandenen Wert. Die leere Zeichenfolge setzt daher Werte von Anbietern außer Kraft, die zuvor in der äußeren Konfiguration registriert sind, anstatt zuzulassen, dass diese früheren Werte wirksam bleiben.

Diese Änderung setzt die Unterscheidung zwischen leeren und null Konfigurationswerten fort, die in .NET 10 durch Nullwerte in der Konfiguration bleiben erhalten eingeführt wurde. Die Behandlung von null durch verkettete Konfiguration ist unverändert.

Eingeführt in Version

.NET 11 RC 1

Bisheriges Verhalten

ChainedConfigurationProvider.TryGet hat eine leere Zeichenfolge als nicht gefunden gemeldet. Folglich hat ein leerer Wert in einer verketteten Konfiguration einen von einem früheren Anbieter bereitgestellten Wert nicht überschrieben:

using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;

IConfiguration inner = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string?>
    {
        ["Endpoint"] = "",
    })
    .Build();

IConfiguration configuration = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string?>
    {
        ["Endpoint"] = "https://example.com",
    })
    .AddConfiguration(inner)
    .Build();

Console.WriteLine($"Endpoint: '{configuration["Endpoint"]}'");

Vor .NET 11 lautete die Ausgabe:

Endpoint: 'https://example.com'

Wenn kein früherer Wert vorhanden war, ergab das Lesen des Schlüssels null, und ein Abschnitt, dessen einziger Wert die verkettete leere Zeichenfolge war, wurde als nicht vorhanden angesehen.

Neues Verhalten

Ab .NET 11 wird eine leere Zeichenfolge als gefunden gemeldet. Im vorherigen Beispiel überschreibt der leere Wert aus inner den früheren Wert, und die Ausgabe lautet:

Endpoint: ''

Ein Abschnitt, dessen Wert eine leere Zeichenfolge ist, wird nun als vorhanden betrachtet. Die Bindung beobachtet auch den leeren Wert anstelle des Werts eines früheren Providers. Wenn Sie beispielsweise eine leere Zeichenfolge über einen früheren numerischen Wert an eine ganzzahlige Eigenschaft binden, löst dies InvalidOperationException aus, im Einklang mit einem leeren Wert, der von einem direkt hinzugefügten Anbieter bereitgestellt wird.

Ein null Wert im umschlossenen IConfiguration wird weiterhin als nicht vorhanden behandelt, da der IConfiguration Indexer einen Schlüssel, dessen Wert null ist, nicht von einem fehlenden Schlüssel unterscheiden kann.

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Eine leere Zeichenfolge ist ein gültiger Konfigurationswert. Die Behandlung als fehlend machte die verkettete Konfiguration im Vergleich zu direkt hinzugefügten Konfigurationsanbietern inkonsistent und verhinderte, dass Anwendungen eine Einstellung absichtlich löschen oder deaktivieren konnten, indem sie sie mit einer leeren Zeichenfolge überschrieben. Das neue Verhalten behält den Unterschied des Konfigurationsanbieters zwischen einem leeren Wert und einem fehlenden Wert bei. Weitere Informationen finden Sie unter dotnet/runtime#131480.

Wenn eine leere Zeichenfolge einen früheren Wert überschreiben soll, ist keine Aktion erforderlich.

Wenn Ihre App eine leere Zeichenfolge in einer verketteten Konfiguration verwendet hat, sodass der Wert eines früheren Anbieters verwendet wird, entfernen Sie diesen Schlüssel aus der verketteten Konfiguration, oder stellen Sie ihn als fehlend oder als null dar. Anwendungen, die verkettete Werte an Nicht-Zeichenfolgentypen binden, sollten auch leere Werte überprüfen oder normalisieren, bevor sie an den Zieltyp gebunden werden, wenn ein leerer Wert für den Zieltyp nicht gültig ist. Es gibt keinen Kompatibilitätsschalter, um das vorherige Verhalten wiederherzustellen.

Betroffene APIs