ConfigureServices에서 개발 / 스테이징 / 생산 호스팅 환경을 얻는 방법


171

시작 방법에서 개발 / 스테이징 / 생산 호스팅 환경을 얻으려면 어떻게해야 ConfigureServices합니까?

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

ConfigureServices방법은 단일 IServiceCollection매개 변수 만 사용합니다 .


4
IHostingEnvironmentConfigureServices에 주입 할 수없는 이유는 무엇입니까? 감시? 또는 우리가 알아야 할 이유는 무엇입니까?
Simon_Weaver 5

답변:


225

ConfigureServices에서 쉽게 액세스 할 수 있으며, 먼저 호출되어 시작된 Startup 메소드 중에 특성에 유지 한 다음 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...
}

13
문서별로이 방법을 사용해서는 안됩니다. 대신을 사용해야합니다 CurrentEnvironment.IsEnvironment("environmentname").
vaindil

28
또는 CurrentEnvironment.IsDevelopment()/CurrentEnvironment.IsProduction()
Simon_Weaver 5

3
@ vaindil-당신이 참조하는 문서는이 방법을 사용해서는 안된다고 말하지 않습니다. 귀하의 예는 단순히 케이싱을 무시합니다. 이것은 많은 경우에 바람직하지만 계명은 아닙니다
Coruscate5

3
@ Coruscate5 좋아, 그것은이 방법을 사용하지 말라고 명시 적으로 말하지는 않지만 다른 방법 INSTEAD를 사용한다고 말합니다. 그것은 사실상 같은 것입니다.
vaindil

8
더 이상 사용되지 않는 IHostingEnvironment env 대신 IWebHostEnvironment env 사용
Mark Schultheiss

56

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원하는 환경으로 설정된 두 가지 중에서 선택할 수 있습니다.

환경 이름 확인

문서에서 :

IHostingEnvironment서비스는 환경 작업을위한 핵심 추상화를 제공합니다. 이 서비스는 ASP.NET 호스팅 계층에서 제공되며 Dependency Injection을 통해 시작 논리에 주입 될 수 있습니다. Visual Studio의 ASP.NET Core 웹 사이트 템플릿은이 방법을 사용하여 환경 별 구성 파일 (있는 경우)을로드하고 앱의 오류 처리 설정을 사용자 지정합니다. 두 경우 모두,이 동작은 호출 EnvironmentName하거나 적절한 메소드로 전달 된 IsEnvironment인스턴스 에서 현재 지정된 환경을 참조하여 수행됩니다 IHostingEnvironment.

참고 : 실제 값 확인 env.EnvironmentName되어 있지 권장!

응용 프로그램이 특정 환경에서 실행 중인지 확인해야하는 env.IsEnvironment("environmentname")경우 ( env.EnvironmentName == "Development"예를 들어 확인하는 대신) 대소 문자를 올바르게 무시하므로 사용 하십시오 .

별도의 수업 사용

문서에서 :

ASP.NET Core 응용 프로그램이 시작되면이 Startup클래스는 응용 프로그램을 부트 스트랩하고 구성 설정을로드하는 데 사용됩니다 ( ASP.NET 시작에 대해 자세히 알아보기 ). 그러나 이름이 지정된 클래스 Startup{EnvironmentName}(예 :)가 StartupDevelopment있고 ASPNETCORE_ENVIRONMENT환경 변수가 해당 이름과 일치하면 해당 Startup클래스가 대신 사용됩니다. 따라서 Startup개발 용으로 구성 할 수 있지만 StartupProduction프로덕션에서 앱을 실행할 때 사용할 별도의 구성 요소가 있습니다. 혹은 그 반대로도.

Startup현재 환경에 따라 완전히 별개의 클래스 를 사용하는 것 외에도 클래스 내에서 응용 프로그램이 구성되는 방식을 조정할 수도 있습니다 Startup. Configure()ConfigureServices()방법은 유사 환경의 특정 버전 지원 Startup형태의 클래스 자체를, Configure{EnvironmentName}()하고 Configure{EnvironmentName}Services(). 메소드를 정의 하면 환경이 개발로 설정 될 때 ConfigureDevelopment()대신 메소드 가 호출됩니다 Configure(). 마찬가지로 같은 환경에서 ConfigureDevelopmentServices()대신 호출됩니다 ConfigureServices().


29

에서 .NET Core 2.0MVC 응용 프로그램 /Microsoft.AspNetCore.All @vaindil에 의해 설명 된 바와 같이 V2.0.0, 당신은 환경 특정 시작 클래스를 가질 수 있지만, 그 방법 좋아하지 않는다.

또한 삽입 할 수 IHostingEnvironmentStartUp생성자입니다. 환경 변수를 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());
            }            
        });

        ......
    }
}


André가 게시 한 영어 링크는 다음과 같습니다. docs.microsoft.com/en-us/aspnet/core/fundamentals/…
ahong

1
더 이상 사용되지 않는 IHostingEnvironment env 대신 IWebHostEnvironment env를 사용하십시오
Mark Schultheiss

21

추가 속성이나 메서드 매개 변수없이 다음과 같이 수행 할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    IServiceProvider serviceProvider = services.BuildServiceProvider();
    IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();

    if (env.IsProduction()) DoSomethingDifferentHere();
}

2
최고의 답변. 고맙습니다
Shady Sherif

7
.NET Core 3.0에서 다음 경고가 발생합니다. 응용 프로그램 코드에서 'BuildServiceProvider'를 호출하면 추가 싱글 톤 서비스 복사본이 만들어집니다. 의존성 주입 서비스와 같은 대안을 '구성'에 대한 매개 변수로 고려하십시오.
영원한 21

2
더 이상 사용되지 않는 IHostingEnvironment env 대신 IWebHostEnvironment env를 사용하십시오
Mark Schultheiss

19

IHostingEnvironment에 쉽게 액세스 할 수없는 코드베이스의 어딘가에서 이것을 테스트 해야하는 경우 다른 쉬운 방법은 다음과 같습니다.

bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";

글쎄, 짧은 길! 변수 이름은 "asp.net core"와 "asp.net"사이에 다릅니다
nmDat

15

문서

Configure 및 ConfigureServices는 Configure {EnvironmentName} 및 Configure {EnvironmentName} 서비스 형식의 환경 별 버전을 지원합니다.

이런 식으로 할 수 있습니다 ...

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
}

1
이것은 좋은 관례
Stuart.Sklinar

11

내 서비스 중 하나에서 환경을 얻고 싶었습니다. 정말 쉽습니다! 나는 이것을 다음과 같이 생성자에 주입합니다.

    private readonly IHostingEnvironment _hostingEnvironment;

    public MyEmailService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

이제 코드에서 나중에이 작업을 수행 할 수 있습니다.

if (_hostingEnvironment.IsProduction()) {
    // really send the email.
}
else {
    // send the email to the test queue.
}

편집하다:

위의 코드는 .NET Core 2 용 IWebHostEnvironment입니다. 버전 3의 경우을 사용하려고합니다 .


5

호스팅 환경은 ASPHost_ENV 환경 변수에서 가져옵니다.이 변수는 시작 중에 IHostingEnvironment.IsEnvironment 확장 방법을 사용하거나 IsDevelopment 또는 IsProduction의 해당 편의 방법 중 하나를 사용하여 사용할 수 있습니다. Startup () 또는 ConfigureServices 호출에 필요한 것을 저장하십시오.

var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");

IHostingEnvironment에서 사용할 수 없습니다 ConfigureServices.
무하마드 Rehan Saeed

1
아뇨. 그것을 다루는 방법에 대한 내 대답을 다시 참조하십시오.
Jeff Dunlop

8
환경 변수는 이제 "ASPNETCORE_ENVIRONMENT"
Anthony

더 이상 사용되지 않는 IHostingEnvironment env 대신 IWebHostEnvironment env 사용
Mark Schultheiss

5

누군가가 이것을 찾고있는 경우를 대비하여. .net core 3 이상에서는 대부분이 더 이상 사용되지 않습니다. 업데이트 방법은 다음과 같습니다.

public void Configure(
    IApplicationBuilder app,
    IWebHostEnvironment env,
    ILogger<Startup> logger)
{
    if (env.EnvironmentName == Environments.Development)
    {
        // logger.LogInformation("In Development environment");
    }
}

2

Dotnet Core 2.0에서 Startup 생성자는 IConfiguration 매개 변수 만 기대합니다.

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

호스팅 환경을 읽는 방법은 무엇입니까? ConfigureAppConfiguration 중에 Program 클래스에 저장합니다 (WebHost.CreateDefaultBuilder 대신 전체 BuildWebHost 사용).

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();
}

더 이상 사용되지 않는 IHostingEnvironment env 대신 IWebHostEnvironment env 사용
Mark Schultheiss
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.