Поиск…


Наличие настроек для среды

Для каждой среды вам нужно создать отдельную настройку. {EnvironmentName} .json files:

  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json

Затем откройте файл project.json и включите их в «include» в разделе «publishOptions». В этом списке перечислены все файлы и папки, которые будут включены при публикации:

"publishOptions": {
  "include": [
    "appsettings.Development.json",
    "appsettings.Staging.json",
    "appsettings.Production.json"
    ... 
  ]
}

Последний шаг. В вашем стартовом классе добавьте:

.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

в конструкторе, где вы настроили источники конфигурации:

var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

Получить / Проверить имя среды из кода

Все, что вам нужно, это переменная типа IHostingEnvironment :

  • получить имя среды:

      env.EnvironmentName
    
  • для предопределенных сред Development , Staging , Production наилучшим способом является использование методов расширения из класса HostingEnvironmentExtensions

      env.IsDevelopment()
      env.IsStaging()
      env.IsProduction()
    
  • правильно игнорировать регистр (другой метод расширения из HostingEnvironmentExtensions :

     env.IsEnvironment("environmentname") 
    
  • чувствительный к регистру вариант:

     env.EnvironmentName == "Development" 
    

Настройка нескольких сред

В этом примере показано, как настроить несколько сред с различной конфигурацией впрыска Dependency Injection и отдельными средними в одном классе Startup .

Наряду с public void Configure(IApplicationBuilder app) и public void ConfigureServices(IServiceCollection services) можно использовать Configure{EnvironmentName} и Configure{EnvironmentName}Services для настройки, зависящей от среды.

Использование этого шаблона позволяет избежать многократной логики if/else одного метода / класса Startup и поддерживать его чистоту и разделение.

public class Startup
{
    public void ConfigureServices(IServiceCollection services) { }
    public void ConfigureStaggingServices(IServiceCollection services) { }
    public void ConfigureProductionServices(IServiceCollection services) { }
    
    public void Configure(IApplicationBuilder app) { }
    public void ConfigureStagging(IApplicationBuilder app) { }
    public void ConfigureProduction(IApplicationBuilder app) { }
}

Если Configure{Environmentname}Services Configure{Environmentname} или Configure{Environmentname}Services не найдены, они вернутся к Configure или ConfigureServices соответственно.

Эта же семантика применима и к классу Startup . StartupProduction будет использоваться , когда ASPNETCORE_ENVIRONMENT переменная устанавливается в Production и будет падать обратно в Startup , когда это Stagging или Development

Полный пример:

public class Startup
{
    public Startup(IHostingEnvironment hostEnv)
    {
        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .SetBasePath(hostEnv.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{hostEnv.EnvironmentName}.json", optional: true, reloadOnChange: true);

        if (hostEnv.IsDevelopment())
        {
            // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
            builder.AddApplicationInsightsSettings(developerMode: true);
        }

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; set; }

    // This method gets called by the runtime. Use this method to add services to the container
    public static void RegisterCommonServices(IServiceCollection services) 
    {
        services.AddScoped<ICommonService, CommonService>();
        services.AddScoped<ICommonRepository, CommonRepository>();
    }
    
    public void ConfigureServices(IServiceCollection services)
    {
        RegisterCommonServices(services);
        
        services.AddOptions();
        services.AddMvc();
    }

    public void ConfigureDevelopment(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();

        app.UseApplicationInsightsRequestTelemetry();
        app.UseApplicationInsightsExceptionTelemetry();
        app.UseStaticFiles();
        app.UseMvc();
    }

    // No console Logger and debugging tools in this configuration
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddDebug();

        app.UseApplicationInsightsRequestTelemetry();
        app.UseApplicationInsightsExceptionTelemetry();
        app.UseStaticFiles();
        app.UseMvc();
    }
}

Отображать содержимое, специфичное для конкретной среды

Возможно, вам придется отображать некоторый контент, который специфичен только для некоторой среды. Для достижения этой цели вы можете использовать вспомогательный тег среды:

<environment names="Development">
    <h1>This is heading for development environment</h1>
</environment>
<environment names="Staging,Production">
    <h1>This is heading for Staging or production environment</h1>
</environment>

Хелпер тега среды будет отображать его содержимое только в том случае, если текущая среда соответствует одному из окружений, указанному с использованием атрибута names .

Установите переменную среды из командной строки

Чтобы настроить среду для Development

SET ASPNETCORE_ENVIRONMENT=Development

Теперь запуск приложения Asp.Net Core будет в определенной среде.

Заметка

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

Установите переменную среды из PowerShell

При использовании PowerShell вы можете использовать setx.exe для постоянной установки переменных среды.

  1. Запустить PowerShell

  2. Введите одно из следующего:

    setx ASPNETCORE_ENVIRONMENT "разработка"

    setx ASPNETCORE_ENVIRONMENT "постановка"

  3. Перезапустить PowerShell

Использование ASPNETCORE_ENVIRONMENT из web.config

Если вы не хотите использовать ASPNETCORE_ENVIRONMENT из переменных окружения и использовать его из web.config вашего приложения, тогда измените web.config как this-

<aspNetCore processPath=".\WebApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
  </environmentVariables>
</aspNetCore>


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow