Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de .NET 11, una configuración agregada mediante AddConfiguration trata una cadena vacía como un valor presente. Por lo tanto, la cadena vacía sobrescribe los valores de los proveedores registrados anteriormente en la configuración externa en lugar de permitir que esos valores anteriores sigan siendo efectivos.
Este cambio continúa la distinción entre valores vacíos y valores de configuración null establecida en .NET 10 en la que los valores NULL se conservan en la configuración. La gestión de null por configuración encadenada no cambia.
Versión introducida
.NET 11 RC 1
Comportamiento anterior
ChainedConfigurationProvider.TryGet informó de que no se encontró una cadena vacía. Por lo tanto, un valor vacío en una configuración encadenada no sobrescribió un valor proporcionado por un proveedor 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, la salida era:
Endpoint: 'https://example.com'
Cuando no había ningún valor anterior, la lectura de la clave devolvió nully una sección cuyo único valor era la cadena vacía encadenada se consideraba que no existía.
Nuevo comportamiento
A partir de .NET 11, ChainedConfigurationProvider.TryGet indica una cadena vacía como encontrada. Con el ejemplo anterior, el valor vacío de inner invalida el valor anterior y la salida es:
Endpoint: ''
Ahora se considera que existe una sección cuyo valor es una cadena vacía. El enlace también tiene en cuenta el valor vacío en lugar del valor de un proveedor anterior. Por ejemplo, al asignar una cadena vacía sobre un valor numérico anterior a una propiedad de tipo entero, se genera una InvalidOperationException, de forma coherente con lo que ocurriría si se proporcionara un valor vacío mediante un proveedor añadido directamente.
Un valor null en el IConfiguration encapsulado sigue siendo tratado como ausente, ya que el indexador IConfiguration no puede distinguir una clave cuyo valor es null de una clave que falta.
Tipo de cambio disruptivo
Este es un cambio de comportamiento.
Motivo del cambio
Una cadena vacía es un valor de configuración válido. Al considerarlo como ausente, la configuración encadenada resultaba incoherente con los proveedores de configuración añadidos directamente e impedía que las aplicaciones borraran o desactivaran de forma intencionada una configuración sobrescribiéndola con una cadena vacía. El nuevo comportamiento conserva la distinción del proveedor de configuración entre un valor vacío y un valor ausente. Para obtener más información, vea dotnet/runtime#131480.
Acción recomendada
Si una cadena vacía está pensada para sobrescribir un valor anterior, no se requiere ninguna acción.
Si la aplicación dependía de una cadena vacía en una configuración encadenada que permitía que el valor de un proveedor anterior ganara, quite esa clave de la configuración encadenada o represéntela como ausente o null. Las aplicaciones que enlazan valores encadenados a tipos que no son de cadena también deben validar o normalizar valores vacíos antes de enlazar si un valor vacío no es válido para el tipo de destino. No hay ningún modificador de compatibilidad para restaurar el comportamiento anterior.