Lege tekenreeksen in gekoppelde configuratieproviders overschrijven eerdere providers

Vanaf .NET 11 wordt een configuratie die is toegevoegd met behulp van AddConfiguration behandeld alsof een lege tekenreeks een aanwezige waarde is. De lege tekenreeks overschrijft daarom waarden van providers die eerder in de buitenste configuratie zijn geregistreerd in plaats van dat deze eerdere waarden van kracht blijven.

Deze wijziging zet het onderscheid voort tussen lege waarden en nullconfiguratiewaarden dat in .NET 10 is ingevoerd door Null-waarden behouden in configuratie. De verwerking van null door ketenconfiguratie is ongewijzigd.

Geïntroduceerde versie

.NET 11 RC 1

Vorig gedrag

ChainedConfigurationProvider.TryGet heeft een lege tekenreeks als niet gevonden gerapporteerd. Een lege waarde in een ketenconfiguratie overschreef dus geen waarde die is opgegeven door een eerdere provider:

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"]}'");

Vóór .NET 11 was de uitvoer:

Endpoint: 'https://example.com'

Wanneer er geen eerdere waarde was, gaf het lezen van de sleutel null terug en werd een sectie waarvan de enige waarde de gekoppelde lege tekenreeks was, geacht niet te bestaan.

Nieuw gedrag

Vanaf .NET 11 rapporteert ChainedConfigurationProvider.TryGet een lege tekenreeks als gevonden. In het voorgaande voorbeeld overschrijft de lege waarde van inner de eerdere waarde en is de uitvoer:

Endpoint: ''

Een sectie waarvan de waarde een lege tekenreeks is, wordt nu geacht te bestaan. Binding ziet ook de lege waarde in plaats van de waarde van een eerdere provider. Als u bijvoorbeeld een lege tekenreeks over een eerdere numerieke waarde aan een eigenschap van het type geheel getal bindt, wordt InvalidOperationException gegenereerd, net als bij een lege waarde die wordt geleverd door een rechtstreeks toegevoegde provider.

Een null-waarde in de verpakte IConfiguration wordt nog steeds als afwezig behandeld, omdat de IConfiguration-indexeerfunctie geen onderscheid kan maken tussen een sleutel waarvan de waarde null is en een ontbrekende sleutel.

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Een lege tekenreeks is een geldige configuratiewaarde. Door dit als ontbrekend te behandelen, werd de gekoppelde configuratie inconsistent met rechtstreeks toegevoegde configuratieproviders en werd voorkomen dat toepassingen opzettelijk een instelling wissen of uitschakelen door deze te overschrijven met een lege tekenreeks. Het nieuwe gedrag behoudt het onderscheid van de configuratieprovider tussen een lege waarde en een afwezige waarde. Zie dotnet/runtime#131480 voor meer informatie.

Als een lege tekenreeks bedoeld is om een eerdere waarde te overschrijven, is er geen actie vereist.

Als uw app afhankelijk was van een lege tekenreeks in een gekoppelde configuratie, waardoor de waarde van een eerdere provider voorrang krijgt, verwijdert u die sleutel uit de gekoppelde configuratie of geeft u deze weer als ontbrekend of null. Toepassingen die gekoppelde waarden aan niet-stringtypen binden, moeten ook lege waarden valideren of normaliseren voordat ze deze binden als een lege waarde niet geldig is voor het doeltype. Er is geen compatibiliteitsswitch om het vorige gedrag te herstellen.

Betreffende API's