Используйте appsettings для управления специфическими параметрами среды, такими как UseUrls.

Когда я занимаюсь локальной разработкой с помощью VS Code, я буду использовать порт 3000, потому что я хипстер. Не-хипстеры хотят, чтобы он был на порту 8080 на сервере. Это круто, мы получили это. Документы Microsoft дают мне следующий пример:

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .AddJsonFile("hosting.json", optional: true)
        .AddCommandLine(args)
        .Build();

    var host = new WebHostBuilder()
        .UseConfiguration(config)
        .UseKestrel()
        .Configure(app =>
        {
            app.Run(async (context) => await context.Response.WriteAsync("Hi!"));
        })
        .Build();

    host.Run();
}

Я не хочу использовать hosting.json. Зачем мне это? У меня есть этот файл appsettings.{environment}.json именно для этой ситуации. Сладкий, я просто вставлю этого плохого парня

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddCommandLine(args)
        .Build();

Что за ошибка компилятора? env не существует в текущем контексте. Он существует только в файле Startup.cs, который не вызывается при запуске, а вызывается из файла запуска Program.cs с помощью колдовства.

Итак, как мне решить эту проблему? Как я могу сохранить свои настройки хостинга для конкретной среды в своем appsettings.json для конкретной среды и впоследствии использовать их при создании своего веб-хостинга для конкретной среды через WebHostBuilder в Program.cs?


person Matthew James Davis    schedule 06.04.2017    source источник
comment
вы можете использовать launchSettings.json для этого.   -  person Lutando    schedule 06.04.2017
comment
используя vscode, но в любом случае хотелось бы получить решение, не зависящее от идеи   -  person Matthew James Davis    schedule 06.04.2017


Ответы (2)


Это возможно. Расширяя ответ, данный здесь, создав WebHostBuilder и ConfigurationBuilder в Program.cs, можно получить доступ к среду хоста, а затем настройте URL-адрес хоста и порт в файлах appsettings для конкретной среды.

Предполагая, что файл appsettings.json и apppsettings.Development.json содержит следующее:

"hostUrl": "http://*:<port number here>"

Измените Main следующим образом:

public static void Main(string[] args)
{
    var host = new WebHostBuilder();
    var env = host.GetSetting("environment");
    var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env}.json", optional: true)
        .AddEnvironmentVariables();
    var configuration = builder.Build();

    host.UseKestrel()
        .UseUrls(configuration["hostUrl"])
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .Build()
        .Run();
}

Используя этот код, Startup.cs по-прежнему должен будет объявить свой собственный ConfigurationBuilder, чтобы публично раскрыть свое свойство Configuration.

person Justin Saraceno    schedule 06.04.2017
comment
env всегда возвращать развитие - person Assaf S.; 09.04.2019

Или, начиная с .NET Core 2.0, при создании IWebHostBuilder по умолчанию, который будет строить реализацию IWebHost, вы можете использовать

return WebHost.CreateDefaultBuilder(args)
            .UseConfiguration(configuration)
            .ConfigureAppConfiguration((builderContext, config) =>
            {
                // nb: here you may clear configuration(s) loaded so far
                var env = builderContext.HostingEnvironment;
                config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true);
            })
            .UseStartup<Startup>();
person Alexander Christov    schedule 11.09.2018
comment
Но как получить доступ к config в UseUrls? - person Assaf S.; 09.04.2019
comment
в .net core 2 вы можете установить порт прослушивания в настройках kestral следующим образом: , int.Parse(порт)); }) - person Rtype; 10.08.2019