Как получить среду хостинга разработки/постановки/производства в 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.0MVC app/Microsoft.AspNetCore.Allv2.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 }