Как получить среду хостинга разработки/постановки/производства в ConfigureServices


как мне получить среду хостинга разработки/постановки/производства в ConfigureServices способ запуска?

public void ConfigureServices(IServiceCollection services)
{
    // Which environment are we running under?
}

The ConfigureServices метод принимает только один

7 73

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
}