Как получить среду хостинга разработки/постановки/производства в ConfigureServices
как мне получить среду хостинга разработки/постановки/производства в ConfigureServices
способ запуска?
public void ConfigureServices(IServiceCollection services)
{
// Which environment are we running under?
}
The ConfigureServices
метод принимает только один
7 ответов:
вы можете легко получить доступ к нему в ConfigureServices, просто сохраните его в свойстве во время запуска метода, который вызывается первым и получает его передал, то вы можете получить доступ к свойству из ConfigureServices
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) { ...your code here... CurrentEnvironment = env; } private IHostingEnvironment CurrentEnvironment{ get; set; } public void ConfigureServices(IServiceCollection services) { string envName = CurrentEnvironment.EnvironmentName; ... your code here... }
TL; DR
установите переменную окружения с именем
ASPNETCORE_ENVIRONMENT
с именем окружения (напримерProduction
). Затем сделайте одну из двух вещей:
- впрыснуть
IHostingEnvironment
наStartup.cs
, а затем использовать, что (env
здесь), чтобы проверить:env.IsEnvironment("Production")
. не проверьте с помощьюenv.EnvironmentName == "Production"
!- используйте либо отдельный
Startup
классы или отдельныеConfigure
/ConfigureServices
функции. Если класс или функции соответствуют этим форматам, они будут использоваться вместо стандартные параметры в этой среде.
Startup{EnvironmentName}()
(весь класс) || пример:StartupProduction()
Configure{EnvironmentName}()
|| пример:ConfigureProduction()
Configure{EnvironmentName}Services()
|| пример:ConfigureProductionServices()
полное описание
документы .NET Core опишите, как это сделать. Используйте переменную окружения с именем
ASPNETCORE_ENVIRONMENT
Это установлено в среде, которую вы хотите, то у вас есть два выбор.Проверьте имя среды
The
IHostingEnvironment
сервис предоставляет основную абстракцию для работы со средами. Эта услуга предоставляется ASP.NET хостинг слой, и может быть введен в логику запуска с помощью инъекции зависимостей. The ASP.NET основной шаблон веб-сайта в Visual Studio использует этот подход для загрузки файлов конфигурации конкретной среды (если таковые имеются) и настройки настройки обработки ошибок приложения. В обоих случаях это поведение достигается путем обращения к текущей среде путем вызоваEnvironmentName
илиIsEnvironment
на примереIHostingEnvironment
передается в соответствующий метод.Примечание: проверка фактического значения
env.EnvironmentName
и не рекомендуем!Если вам нужно проверить, работает ли приложение в определенной среде, использовать
env.IsEnvironment("environmentname")
, так как он будет правильно игнорировать регистр (вместо проверки, еслиenv.EnvironmentName == "Development"
например).использовать отдельные классы
когда ASP.NET основное приложение запускается,
Startup
класс используется для того, чтобы запустить приложение, загрузить его настройки и т. д. (подробнее ASP.NET startup). Однако, если класс существует с именемStartup{EnvironmentName}
(например,StartupDevelopment
), иASPNETCORE_ENVIRONMENT
переменные среды соответствует этому имени, то чтоStartup
вместо этого используется класс. Таким образом, вы можете настроитьStartup
для развития, но есть отдельныеStartupProduction
это будет использоваться, когда приложение запускается в производстве. Или наоборот.в дополнение к использованию совершенно отдельной
Startup
класс на основе текущей среды, вы также можете внести изменения в то, как приложение настроено в пределахStartup
класса. ЭлементConfigure()
иConfigureServices()
методы поддерживают версии для конкретной среды похоже наStartup
сам класс, формыConfigure{EnvironmentName}()
иConfigure{EnvironmentName}Services()
. Если вы определяете методConfigureDevelopment()
он будет называться вместоConfigure()
когда среда настроена на разработку. Аналогично,ConfigureDevelopmentServices()
будет называться вместоConfigureServices()
в той же среде.
на
.NET Core 2.0
MVC app/Microsoft.AspNetCore.All
v2.0.0, вы можете иметь класс запуска для окружающей среды, как описано @vaindil, но мне не нравится этот подход.вы также можете ввести
IHostingEnvironment
наStartUp
конструктор. Вам не нужно хранить переменную среды вProgram
класса.public class Startup { private readonly IHostingEnvironment _currentEnvironment; public IConfiguration Configuration { get; private set; } public Startup(IConfiguration configuration, IHostingEnvironment env) { _currentEnvironment = env; Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { ...... services.AddMvc(config => { // Requiring authenticated users on the site globally var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); config.Filters.Add(new AuthorizeFilter(policy)); // Validate anti-forgery token globally config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()); // If it's Production, enable HTTPS if (_currentEnvironment.IsProduction()) // <------ { config.Filters.Add(new RequireHttpsAttribute()); } }); ...... } }
среда размещения происходит от переменной среды ASPNET_ENV, которая доступна во время запуска с помощью IHostingEnvironment.Метод расширения IsEnvironment, или один из соответствующих методов удобства IsDevelopment или IsProduction. Либо сохраните то, что вам нужно в Startup (), либо в ConfigureServices вызовите:
var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");
Это можно сделать без каких-либо дополнительных свойств или параметров метода, например, так:
public void ConfigureServices(IServiceCollection services) { IServiceProvider serviceProvider = services.BuildServiceProvider(); IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>(); if (env.IsProduction()) DoSomethingDifferentHere(); }
В dotnet Core 2.0 запуск-конструктор ожидает только IConfiguration-параметр.
public Startup(IConfiguration configuration) { Configuration = configuration; }
как читать там таких условий? Я храню его в программном классе во время ConfigureAppConfiguration (используйте полный BuildWebHost вместо WebHost.CreateDefaultBuilder):
public class Program { public static IHostingEnvironment HostingEnvironment { get; set; } public static void Main(string[] args) { // Build web host var host = BuildWebHost(args); host.Run(); } public static IWebHost BuildWebHost(string[] args) { return new WebHostBuilder() .UseConfiguration(new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("hosting.json", optional: true) .Build() ) .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; // Assigning the environment for use in ConfigureServices HostingEnvironment = env; // <--- config .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment()) { var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); if (appAssembly != null) { config.AddUserSecrets(appAssembly, optional: true); } } config.AddEnvironmentVariables(); if (args != null) { config.AddCommandLine(args); } }) .ConfigureLogging((hostingContext, builder) => { builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); builder.AddConsole(); builder.AddDebug(); }) .UseIISIntegration() .UseDefaultServiceProvider((context, options) => { options.ValidateScopes = context.HostingEnvironment.IsDevelopment(); }) .UseStartup<Startup>() .Build(); }
Ant затем читает его в ConfigureServices следующим образом:
public IServiceProvider ConfigureServices(IServiceCollection services) { var isDevelopment = Program.HostingEnvironment.IsDevelopment(); }
на docs
настройка и ConfigureServices поддержка конкретных версий среды формы Configure{EnvironmentName} и Configure{EnvironmentName}Services:
вы можете сделать что-то подобное...
public void ConfigureProductionServices(IServiceCollection services) { ConfigureCommonServices(services); //Services only for production services.Configure(); } public void ConfigureDevelopmentServices(IServiceCollection services) { ConfigureCommonServices(services); //Services only for development services.Configure(); } public void ConfigureStagingServices(IServiceCollection services) { ConfigureCommonServices(services); //Services only for staging services.Configure(); } private void ConfigureCommonServices(IServiceCollection services) { //Services common to each environment }