Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Från och med .NET 8 hoppar ConfigurationBinder tyst över matris- och listelement vars värden inte kan konverteras till måltypen. Tidigare bevarades misslyckade element som null platshållare och den resulterande samlingen behöll samma längd som antalet element i konfigurationskällan.
Version lanserad
.NET 8
Tidigare beteende
Tidigare, när en matris eller listegenskap binds via Get<T>(IConfiguration) eller Bind(IConfiguration, Object), om ett elements värde inte kunde konverteras till måltypen, bevarades elementet som platshållare null i resultatet. Samlingslängden matchade antalet element i konfigurationen.
// 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)
Nytt beteende
Från och med .NET 8 ignoreras element som misslyckas med typkonvertering tyst. Den resulterande samlingen innehåller endast bundna element och har en kortare längd än antalet poster i konfigurationskällan.
var settings = configuration.GetSection("Items").Get<MyItem[]>();
// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändringen
Den interna implementeringen av ConfigurationBinder omstrukturerades i .NET 8. I stället för att förallokera målmatrisen och binda element på plats (som lämnades null vid konverteringsfel) samlar bindningen nu endast de element som bundits framgångsrikt i en tillfällig lista innan den slutliga matrisen materialiseras.
Det tidigare beteendet var också problematiskt för värdetyper som int[]. För ett ogiltigt konfigurationsvärde skulle bindaren lagra 0, som var omöjlig att skilja från ett legitimt värde för 0. Det nya beteendet undviker den här tvetydigheten.
Rekommenderad åtgärd
Aktivera ErrorOnUnknownConfiguration under utvecklingen för att visa ogiltiga konfigurationsvärden omedelbart i stället för att tyst släppa element:
var settings = configuration.GetSection("Items").Get<MyItem[]>(options => options.ErrorOnUnknownConfiguration = true);Från och med .NET 8 leder ConfigurationBinder det här alternativet också till att utlösa ett InvalidOperationException när ett värde inte kan konverteras till måltypen. Mer information finns i ConfigurationBinder kastar för icke matchande värden.
Åtgärda ogiltiga konfigurationsvärden. Se till att alla värden i konfigurationskällan matchar de förväntade typerna för den bundna modellen.
Verifiera samlingslängder efter bindning om koden är beroende av antalet element som matchar konfigurationskällan.
Använd strängegenskaper med manuell parsning om du behöver hantera okonverterbara värden på ett smidigt sätt och bevara alla matrisposter.
Berörda API:er
- 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>)