Prefijos de variables de entorno

Los datos jerárquicos se representan usando : como delimitador de nivel. Sin embargo, en las variables de entorno, el carácter : se normaliza en __, ya que este último es compatible en todas las plataformas. Este cambio afecta a la forma en que se comparan los prefijos y las claves normalizados y no normalizados. En concreto, ahora se pueden agregar variables de entorno especificando un prefijo que contenga : o __ como delimitador. Ambas sintaxis hallarán cualquier variable de entorno que tenga un prefijo coincidente seguido de : o de __. Algunas variables de entorno que en teoría no coincidían con el filtro anteriormente ahora sí pueden coincidir.

Versión introducida

.NET 7 (versión preliminar 4)

Comportamiento anterior

Antes, el siguiente código imprimía False:

using Microsoft.Extensions.Configuration;

const string myValue = "value1";
Environment.SetEnvironmentVariable("MY_PREFIX__ConfigKey", myValue);

IConfiguration config = new ConfigurationBuilder()
    .AddEnvironmentVariables(prefix: "MY_PREFIX__")
    .Build();

var loadedValue = config.GetValue<string?>("ConfigKey", null);

Console.WriteLine(String.Equals(myValue, loadedValue));
// False

Para que la variable de entorno MY_PREFIX__ConfigKey pudiera agregarse a la configuración, había que agregar variables de entorno usando un delimitador : en lugar de __:

using Microsoft.Extensions.Configuration;

const string myValue = "value1";
Environment.SetEnvironmentVariable("MY_PREFIX__ConfigKey", myValue);

IConfiguration config = new ConfigurationBuilder()
    .AddEnvironmentVariables(prefix: "MY_PREFIX:")
    .Build();

var loadedValue = config.GetValue<string?>("ConfigKey", null);

Console.WriteLine(String.Equals(myValue, loadedValue));
// True

Comportamiento nuevo

A partir de .NET 7, el siguiente código imprime True:

using Microsoft.Extensions.Configuration;

const string myValue = "value1";
Environment.SetEnvironmentVariable("MY_PREFIX__ConfigKey", myValue);

IConfiguration config = new ConfigurationBuilder()
    .AddEnvironmentVariables(prefix: "MY_PREFIX__")
    .Build();

var loadedValue = config.GetValue<string?>("ConfigKey", null);

Console.WriteLine(String.Equals(myValue, loadedValue));
// True

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

Este cambio se ha realizado con objeto de corregir un cambio de comportamiento inintencionado para normalizar los filtros de prefijos de variables de entorno en .NET 6. El nuevo comportamiento coincide con el comportamiento de .NET 5.

La mayoría de los desarrolladores no se verán afectados por este cambio, ya que corrige el comportamiento erróneo anterior. En el improbable caso de que se haya basado en el hecho de que un prefijo que contiene __ no coincide con una variable de entorno que contiene __, considere la posibilidad de cambiar los prefijos de esas variables.

API afectadas

Vea también