Как читать Windows переменные окружения на ядре do tnet? - PullRequest
1 голос
/ 24 апреля 2020

Я создаю веб-API с использованием do tnet core 3.1, и теперь я столкнулся с необходимостью сохранять некоторую конфиденциальную информацию в переменной среды Windows, что я уже сделал. Давайте назовем это MY_WIN_VAL_X.

Я пытался использовать следующий код в методе ConfigureServices на Startup.cs ( ссылка )

public class Startup
{
    private IHostEnvironment Environment { get; set; }

    public Startup(IConfiguration configuration, IHostEnvironment environment)
    {
        Environment = environment;

        this.Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
       ...other code
       var myEnvValX = Environment.GetEnvironmentVariable("MY_WIN_VAL_X");
    }
}

Однако я получил эту ошибку:

«IHostEnvironment» не содержит определения для «GetEnvironmentVariable», и нет доступного метода расширения «GetEnvironmentVariable», принимающего первый аргумент типа «IHostEnvironment» (вы пропустили директиву using или ссылку на сборку? ) [API] csharp (CS1061)

Кто-нибудь знает, как этого добиться? Как получить пользовательскую переменную окружения Windows?

1 Ответ

2 голосов
/ 24 апреля 2020

Чтение переменных среды выполняется с помощью Механизма конфигурации и, следовательно, доступно через объект IConfiguration, а не объект IHostEnvironment.

Чтобы добавить переменные среды в вашу конфигурацию, вам нужно добавить это в ваш Program.cs файл:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddEnvironmentVariables(); // <-- this line
                // optional: use a prefix
                //config.AddEnvironmentVariables(prefix: "MYPREFIX_"); // <-- this line
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

И тогда вы можете прочитать переменную среды следующим образом:

public class Startup
{
    private IConfiguration Configuration { get; set; }
    private IHostEnvironment Environment { get; set; }

    public Startup(IConfiguration configuration, IHostEnvironment environment)
    {
        Environment = environment;

        this.Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
       ...other code
       var myEnvValX = this.Configuration["MY_WIN_VAL_X"];
    }
}

Обратите внимание, что вы можете ограничить доступные переменные среды, добавив к ним префикс. Например, если у вас есть MYPREFIX_MY_WIN_VAL_X, MYPREFIX_MY_WIN_VAL_Y, вы можете ограничить переменные env с помощью config.AddEnvironmentVariables(prefix: "MYPREFIX_"), и будут показаны только эти две переменные (префикс будет удален).

...