Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A partir do .NET 11, uma configuração adicionada usando AddConfiguration trata uma cadeia de caracteres vazia como um valor presente. Portanto, a cadeia de caracteres vazia substitui valores de provedores registrados anteriormente na configuração externa, em vez de permitir que esses valores anteriores permaneçam efetivos.
Essa alteração continua a distinção entre valores vazios e null valores de configuração estabelecida no .NET 10 por valores nulos preservados na configuração. O tratamento por configuração encadeada de null permanece inalterado.
Versão introduzida
.NET 11
Comportamento anterior
ChainedConfigurationProvider.TryGet relatou uma string vazia como não encontrada. Consequentemente, um valor vazio em uma configuração encadeada não substituiu um valor fornecido por um provedor anterior:
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"]}'");
Antes de .NET 11, a saída era:
Endpoint: 'https://example.com'
Quando não havia nenhum valor anterior, a leitura da chave retornava null, e uma seção cujo único valor era a cadeia de caracteres vazia encadeada era considerada inexistente.
Novo comportamento
A partir do .NET 11, ChainedConfigurationProvider.TryGet relata uma cadeia de caracteres vazia como encontrada. Com o exemplo anterior, o valor vazio de inner substitui o valor anterior e a saída é:
Endpoint: ''
Uma seção cujo valor é uma cadeia de caracteres vazia agora é considerada existente. O binding também observa o valor vazio em vez do valor de um provedor anterior. Por exemplo, associar uma cadeia de caracteres vazia sobre um valor numérico anterior a uma propriedade de inteiro gera InvalidOperationException, consistentemente com um valor vazio fornecido por um provedor diretamente adicionado.
Um null valor no encapsulado IConfiguration continua a ser tratado como ausente, pois o IConfiguration indexador não pode distinguir uma chave cujo valor é null de uma chave ausente.
Tipo de mudança disruptiva
Esta é uma alteração comportamental.
Motivo da alteração
Uma cadeia de caracteres vazia é um valor de configuração válido. Tratá-la como ausente tornou a configuração encadeada inconsistente com provedores de configuração adicionados diretamente e impediu que os aplicativos limpem ou desabilitem intencionalmente uma configuração substituindo-a por uma cadeia de caracteres vazia. O novo comportamento preserva a distinção do provedor de configuração entre um valor vazio e um valor ausente. Para obter mais informações, consulte dotnet/runtime#131480.
Ação recomendada
Se uma cadeia de caracteres vazia for destinada a substituir um valor anterior, nenhuma ação será necessária.
Se seu aplicativo dependia de uma cadeia de caracteres vazia em uma configuração encadeada permitindo que o valor de um provedor anterior vencesse, remova essa chave da configuração encadeada ou represente-a como ausente ou null. Os aplicativos que associam valores encadeados a tipos que não são de cadeia de caracteres também devem validar ou normalizar valores vazios antes da associação se um valor vazio não for válido para o tipo de destino. Não há nenhuma opção de compatibilidade para restaurar o comportamento anterior.