시작 방법에서 개발 / 스테이징 / 생산 호스팅 환경을 얻으려면 어떻게해야 ConfigureServices
합니까?
public void ConfigureServices(IServiceCollection services)
{
// Which environment are we running under?
}
이 ConfigureServices
방법은 단일 IServiceCollection
매개 변수 만 사용합니다 .
시작 방법에서 개발 / 스테이징 / 생산 호스팅 환경을 얻으려면 어떻게해야 ConfigureServices
합니까?
public void ConfigureServices(IServiceCollection services)
{
// Which environment are we running under?
}
이 ConfigureServices
방법은 단일 IServiceCollection
매개 변수 만 사용합니다 .
답변:
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...
}
CurrentEnvironment.IsDevelopment()
/CurrentEnvironment.IsProduction()
라는 환경 변수를 설정하십시오. 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()
.
에서 .NET Core 2.0
MVC 응용 프로그램 /Microsoft.AspNetCore.All
@vaindil에 의해 설명 된 바와 같이 V2.0.0, 당신은 환경 특정 시작 클래스를 가질 수 있지만, 그 방법 좋아하지 않는다.
또한 삽입 할 수 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());
}
});
......
}
}
추가 속성이나 메서드 매개 변수없이 다음과 같이 수행 할 수 있습니다.
public void ConfigureServices(IServiceCollection services)
{
IServiceProvider serviceProvider = services.BuildServiceProvider();
IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();
if (env.IsProduction()) DoSomethingDifferentHere();
}
문서 당
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
}
내 서비스 중 하나에서 환경을 얻고 싶었습니다. 정말 쉽습니다! 나는 이것을 다음과 같이 생성자에 주입합니다.
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의 경우을 사용하려고합니다 .
호스팅 환경은 ASPHost_ENV 환경 변수에서 가져옵니다.이 변수는 시작 중에 IHostingEnvironment.IsEnvironment 확장 방법을 사용하거나 IsDevelopment 또는 IsProduction의 해당 편의 방법 중 하나를 사용하여 사용할 수 있습니다. Startup () 또는 ConfigureServices 호출에 필요한 것을 저장하십시오.
var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");
IHostingEnvironment
에서 사용할 수 없습니다 ConfigureServices
.
누군가가 이것을 찾고있는 경우를 대비하여. .net core 3 이상에서는 대부분이 더 이상 사용되지 않습니다. 업데이트 방법은 다음과 같습니다.
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env,
ILogger<Startup> logger)
{
if (env.EnvironmentName == Environments.Development)
{
// logger.LogInformation("In Development environment");
}
}
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
ConfigureServices에 주입 할 수없는 이유는 무엇입니까? 감시? 또는 우리가 알아야 할 이유는 무엇입니까?