Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À compter de .NET 11, une configuration ajoutée à l’aide de AddConfiguration considère une chaîne vide comme une valeur présente. La chaîne vide remplace donc les valeurs des fournisseurs inscrits précédemment dans la configuration externe au lieu d’autoriser ces valeurs antérieures à rester effectives.
Cette modification continue la distinction entre les valeurs de configuration vides et null établie dans .NET 10 par les valeurs Null conservées dans la configuration. La gestion de null par la configuration chaînée n’est pas modifiée.
Version introduite
.NET 11 RC 1
Comportement antérieur
ChainedConfigurationProvider.TryGet a signalé une chaîne vide comme introuvable. Par conséquent, une valeur vide dans une configuration chaînée n’a pas remplacé une valeur fournie par un fournisseur antérieur :
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"]}'");
Avant .NET 11, la sortie était :
Endpoint: 'https://example.com'
Lorsqu’il n’y avait aucune valeur antérieure, la lecture de la clé retournait null, et une section dont la seule valeur était la chaîne vide chaînée était considérée comme inexistante.
Nouveau comportement
À compter de .NET 11, ChainedConfigurationProvider.TryGet signale une chaîne vide comme trouvée. Avec l’exemple précédent, la valeur vide de inner remplace la valeur précédente et la sortie est :
Endpoint: ''
Une section dont la valeur est une chaîne vide est maintenant considérée comme existant. Le binding observe également la valeur vide au lieu de la valeur d’un fournisseur de données antérieur. Par exemple, la liaison d’une chaîne vide sur une propriété entière, par-dessus une valeur numérique antérieure, lève InvalidOperationException, de manière cohérente avec une valeur vide fournie par un fournisseur directement ajouté.
Une null valeur dans le wrapped IConfiguration continue d’être traitée comme absente, car l’indexeur IConfiguration ne peut pas distinguer une clé dont la valeur est null d’une clé manquante.
Type de changement avec rupture de compatibilité
Ce changement est un changement de comportement.
Raison du changement
Une chaîne vide est une valeur de configuration valide. Le fait de le traiter comme manquant a rendu la configuration chaînée incohérente avec les fournisseurs de configuration directement ajoutés et a empêché les applications d’effacer ou de désactiver intentionnellement un paramètre en le remplaçant par une chaîne vide. Le nouveau comportement conserve la distinction du fournisseur de configuration entre une valeur vide et une valeur absente. Pour plus d’informations, consultez dotnet/runtime#131480.
Action recommandée
Si une chaîne vide est destinée à remplacer une valeur antérieure, aucune action n’est requise.
Si votre application s’appuie sur une chaîne vide dans une configuration chaînée permettant à la valeur d’un fournisseur précédent de prévaloir, supprimez cette clé de la configuration chaînée ou représentez-la comme manquante ou null. Les applications qui lient des valeurs chaînées à des types autres que les chaînes doivent également valider ou normaliser les valeurs vides avant d’effectuer la liaison si une valeur vide n’est pas valide pour le type cible. Il n’existe aucun commutateur de compatibilité pour restaurer le comportement précédent.