asp.net-core
Настройка нескольких сред
Поиск…
Наличие настроек для среды
Для каждой среды вам нужно создать отдельную настройку. {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
наилучшим способом является использование методов расширения из класса HostingEnvironmentExtensionsenv.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 будет в определенной среде.
Заметка
- Не должно быть места до и после знака равенства
=
. - Командная строка не должна закрываться перед запуском приложения, потому что настройки не сохраняются.
Установите переменную среды из PowerShell
При использовании PowerShell вы можете использовать setx.exe для постоянной установки переменных среды.
Запустить PowerShell
Введите одно из следующего:
setx ASPNETCORE_ENVIRONMENT "разработка"
setx ASPNETCORE_ENVIRONMENT "постановка"
Перезапустить 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>