Переменная системной среды со строкой соединения возвращает нулевое значение при вызове в .net core 2.1 - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь сохранить строку подключения в моей системной переменной (windows 10) для защиты моей конфиденциальной информации перед началом работы.

Когда я вызываю переменные среды, она возвращает нулевое значение.У меня нет ошибок.

Я следовал этим урокам:

https://www.youtube.com/watch?v=TNghzUs0BQI&fbclid=IwAR2YUue7740qgVT_5z04xruel-4NwOuUyjQj5E63T1UpYqRoVuz_81DiZTo

https://medium.com/@gparlakov/the-confusion-of-asp-net-configuration-with-environment-variables-c06c545ef732

Я не вижу, чтоЯ скучаю здесь.Насколько я понимаю, если я не использую префиксы, мне просто необходимо установить переменную окружения в моей системе, а затем сделать вызов.

Вот изображение моей переменной окружения.Я предоставляю ссылку, потому что у меня недостаточно интернет-точек для публикации изображения.

https://i.imgur.com/j614O1n.png

Это мой Startup.cs

        private IConfiguration _configuration;

        public Startup(IConfiguration configuration)
        {
            _configuration = configuration;

        }
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddDbContext<dbApplicationServiceNavada>(options => options.UseMySql(Environment.GetEnvironmentVariable("ASNConnStr")));

            services.AddScoped<IEmployeeData, SqlEmployeeData>();
            services.AddScoped<ILanguageData, SqlLanguageData>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app,
                                IHostingEnvironment env,
                                IConfiguration configuration)
        {
            //Show exception stack trace when in dev mode
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //Use files in wwwroot folder
            app.UseStaticFiles();

            //Defines the available routes
            app.UseMvc(ConfigureRoutes);

            app.Run(async (context) =>
            {
                var RNA = configuration["RouteNA"];
                context.Response.ContentType = "text/plain";
                await context.Response.WriteAsync(RNA);
            });
        }

Это мой webHostBuilder в Program.cs


        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddEnvironmentVariables();
                })
                .UseStartup<Startup>()
                .Build();

. Я также вижу, что у меня есть файл launchSettings.json с переменными среды, но мне интересно, совпадает ли это с переменными системной среды.

ПЕРВОЕ РЕДАКТИРОВАНИЕ:

Как уже упоминалось в ответе, я переименовал переменную среды в

MYSQLCONNSTR_ASNConnStr

Я также удалил часть в моей программе.загрузить переменную среды.

Теперь, когда я отлаживаю проект, я вижу в своем _confirguration.Providers загружаемую переменную среды.Вот картинка: https://i.imgur.com/xGulUvX.png

Когда я делаю

services.AddDbContext<dbApplicationServiceNavada>(options => options.UseMySql(_configuration.GetConnectionString("ASNConnStr")));

Он по-прежнему возвращает нулевое значение.Кажется, я не могу получить переменную.

Изображение ошибки: https://i.imgur.com/Kj0mvCS.png

ВТОРОЕ РЕДАКТИРОВАНИЕ:

Теперьпроблема решена, я просто хочу добавить к автору Simply Ged, что вместо:

services.AddDbContext<dbApplicationServiceNavada>(options => options.UseMySql(_configuration.GetConnectionString("ASNConnStr")));

мне пришлось сделать:

services.AddDbContext<dbApplicationServiceNavada>(options => options.UseMySql(Environment.GetEnvironmentVariable("ASNConnStr")));

Теперь все работает отлично!

ТРЕТЬЕ РЕДАКТИРОВАНИЕ:

После перезагрузки компьютера эта строка кода работает:

services.AddDbContext<dbApplicationServiceNavada>(options => options.UseMySql(_configuration.GetConnectionString("ASNConnStr")));

Похоже, что нам нужно перезагрузить компьютер / сервер вЧтобы получить переменную среды адекватно.

В заключение, ответ автора Simply Ged был верным.

1 Ответ

2 голосов
/ 10 мая 2019

Вам не нужно добавлять ConfigureAppConfiguration для добавления переменных среды в конфигурацию, как это делается в WebHost.CreateDefaultBuilder. См. эту страницу для получения подробной информации о том, что предоставляет компоновщик по умолчанию.

Зная это, вы можете заменить прочитанную строку подключения из класса Configuration:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddDbContext<dbApplicationServiceNavada>(options => options.UseMySql(Configuration.GetConnectionString("ASNConnStr")));

    ....
}

Класс Configuration загрузит правильное значение в соответствии с определенным порядком здесь

Вам также необходимо изменить имя переменной среды на следующее:

MYSQLCONNSTR_ASNConnStr

Подробнее о настройке вы можете прочитать в .NET Core здесь

...