Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od platformy .NET 8, ConfigurationBinder milcząco pomija elementy tablicy i listy, których wartości nie można przekonwertować na docelowy typ. Wcześniej elementy, które zakończyły się niepowodzeniem, zostały zachowane jako null symbole zastępcze, a wynikowa kolekcja zachowała taką samą długość jak liczba elementów w źródle konfiguracji.
Wersja wprowadzona
.NET 8
Poprzednie zachowanie
Wcześniej, podczas wiązania tablicy lub właściwości listy za pomocą Get<T>(IConfiguration) lub Bind(IConfiguration, Object), jeśli wartość elementu nie mogła zostać przekonwertowana na typ docelowy, element ten został zachowany jako symbol zastępczy null w wyniku. Długość kolekcji odpowiadała liczbie elementów w konfiguracji.
// 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)
Nowe zachowanie
Począwszy od platformy .NET 8, elementy, które nie przechodzą konwersji typów, są pomijane bez powiadomienia. Wynikowa kolekcja zawiera tylko pomyślnie powiązane elementy i ma krótszą długość niż liczba wpisów w źródle konfiguracji.
var settings = configuration.GetSection("Items").Get<MyItem[]>();
// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }
Typ zmiany przełamującej
Ta zmiana jest zmianą behawioralną.
Przyczyna zmiany
Wewnętrzna implementacja ConfigurationBinder została refaktoryzowana na platformie .NET 8. Zamiast wstępnie przydzielać tablicę docelową i elementy powiązania w miejscu (które pozostały null po niepowodzeniu konwersji), powiązanie zbiera teraz tylko pomyślnie powiązane elementy do listy tymczasowej przed materializacją ostatecznej tablicy.
Poprzednie zachowanie było również problematyczne dla typów wartości, takich jak int[]. W przypadku nieprawidłowej wartości konfiguracji binder będzie przechowywać 0, co było nie do odróżnienia od wartości prawidłowej 0. Nowe zachowanie pozwala uniknąć tej niejednoznaczności.
Zalecana akcja
Włącz ErrorOnUnknownConfiguration podczas programowania , aby natychmiast wyświetlić nieprawidłowe wartości konfiguracji, a nie dyskretnie upuszczać elementy:
var settings = configuration.GetSection("Items").Get<MyItem[]>(options => options.ErrorOnUnknownConfiguration = true);Począwszy od platformy .NET 8, ta opcja również powoduje ConfigurationBinder zgłoszenie InvalidOperationException gdy nie można przekonwertować wartości na docelowy typ. Aby uzyskać więcej informacji, zobacz ConfigurationBinder zgłasza błędną wartość.
Napraw nieprawidłowe wartości konfiguracji. Upewnij się, że wszystkie wartości w źródle konfiguracji są zgodne z oczekiwanym typem dla powiązanego modelu.
Zweryfikuj długość kolekcji po powiązaniu, jeśli kod zależy od liczby elementów pasujących do źródła konfiguracji.
Użyj właściwości ciągu z ręcznym analizowaniem , jeśli chcesz bezpiecznie obsługiwać niekonwertowalne wartości i zachować wszystkie wpisy tablicy.
Interfejsy API, których dotyczy problem
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration, Action<BinderOptions>)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object, Action<BinderOptions>)