Puste ciągi w konfiguracji łańcuchowej zastępują wcześniejsze źródła konfiguracji

Począwszy od .NET 11, konfiguracja dodana przy użyciu AddConfiguration traktuje pusty ciąg jako obecną wartość. Dlatego pusty ciąg zastępuje wartości od dostawców zarejestrowanych wcześniej w konfiguracji zewnętrznej, zamiast zezwalać tym wcześniejszym wartościom na pozostanie skuteczne.

Ta zmiana kontynuuje rozróżnienie między wartościami pustymi a wartościami konfiguracji null, ustanowione w platformie .NET 10 przez zachowanie wartości null w konfiguracji. Obsługa elementu null przez konfigurację łańcuchową pozostaje bez zmian.

Wersja wprowadzona

.NET 11 RC 1

Poprzednie zachowanie

ChainedConfigurationProvider.TryGet zgłosił pusty ciąg jako nieznaleziony. W związku z tym pusta wartość w konfiguracji łańcuchowej nie zastąpiła wartości dostarczonej przez wcześniejszego dostawcę:

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

Przed .NET 11 dane wyjściowe:

Endpoint: 'https://example.com'

Jeśli nie było wcześniejszej wartości, odczyt klucza zwrócił null, a sekcja, której jedyną wartością był połączony pusty ciąg znaków, została uznana za nieistniejącą.

Nowe zachowanie

Począwszy od .NET 11, ChainedConfigurationProvider.TryGet raportuje pusty ciąg jako znaleziony. W poprzednim przykładzie pusta wartość z inner przesłania wcześniejszą wartość, a dane wyjściowe to:

Endpoint: ''

Sekcja, której wartość jest pustym ciągiem, jest teraz uważana za istniejącą. Powiązanie obserwuje również pustą wartość zamiast wartości wcześniejszego dostawcy. Na przykład powiązanie pustego ciągu zamiast wcześniejszej wartości liczbowej z właściwością typu całkowitego zgłasza InvalidOperationException, spójnie z pustą wartością dostarczaną przez bezpośrednio dodanego dostawcę.

Wartość w opakowanym IConfiguration nadal jest traktowana jako nieobecna, ponieważ indeksator IConfiguration nie może odróżnić klucza, którego wartością jest null, od brakującego klucza.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Pusty ciąg jest prawidłową wartością konfiguracji. Traktowanie tego jako brakującego elementu powodowało niespójność konfiguracji łańcuchowej z bezpośrednio dodanymi dostawcami konfiguracji i uniemożliwiło aplikacjom celowe wyczyszczenie lub wyłączenie ustawienia przez zastąpienie go pustym ciągiem. Nowe zachowanie zachowuje wprowadzone przez dostawcę konfiguracji rozróżnienie między pustą a nieobecną wartością. Aby uzyskać więcej informacji, zobacz dotnet/runtime#131480.

Jeśli pusty ciąg ma zastąpić wcześniejszą wartość, żadna akcja nie jest wymagana.

Jeśli aplikacja opierała się na pustym ciągu w konfiguracji łańcuchowej, tak aby wartość wcześniejszego dostawcy miała pierwszeństwo, usuń ten klucz z konfiguracji łańcuchowej lub traktuj go jako brakujący lub null. Aplikacje, które wiążą wartości łańcuchowe z typami innymi niż string, również powinny weryfikować lub normalizować puste wartości przed powiązaniem, jeśli wartość pusta jest nieprawidłowa dla typu docelowego. Nie ma przełącznika zgodności w celu przywrócenia poprzedniego zachowania.

Interfejsy API, których dotyczy problem