スタートアップの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...
}
ASPNETCORE_ENVIRONMENT
という名前の環境変数に環境の名前を設定します(例:Production
)。次に、次の2つのいずれかを実行します。
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
という環境変数を使用する場合、2つの選択肢があります。
ドキュメントから :
IHostingEnvironment
サービスは、環境を操作するためのコア抽象化を提供します。このサービスはASP.NETホスティングレイヤーによって提供され、依存性注入を介してスタートアップロジックに注入できます。 Visual StudioのASP.NET Core Webサイトテンプレートは、このアプローチを使用して、環境固有の構成ファイル(存在する場合)を読み込み、アプリのエラー処理設定をカスタマイズします。どちらの場合も、適切なメソッドに渡されたEnvironmentName
のインスタンスでIsEnvironment
またはIHostingEnvironment
を呼び出して、現在指定されている環境を参照することで、この動作を実現します。
注:env.EnvironmentName
の実際の値を確認することはnotを推奨します!
アプリケーションが特定の環境で実行されているかどうかを確認する必要がある場合は、
env.IsEnvironment("environmentname")
を使用してください。たとえば、env.EnvironmentName == "Development"
を確認する代わりに、大文字と小文字を正しく無視します。
ドキュメントから :
ASP.NET Coreアプリケーションが起動すると、
Startup
クラスを使用して、アプリケーションのbootstrap、構成設定の読み込みなどが行われます( ASP.NETの起動の詳細 )。ただし、Startup{EnvironmentName}
という名前のクラス(たとえばStartupDevelopment
)が存在し、ASPNETCORE_ENVIRONMENT
環境変数がその名前と一致する場合は、代わりにそのStartup
クラスが使用されます。したがって、開発用にStartup
を構成できますが、アプリを実稼働で実行するときに使用される別のStartupProduction
を使用できます。またはその逆。現在の環境に基づいて完全に独立した
Startup
クラスを使用することに加えて、Startup
クラス内でのアプリケーションの構成方法を調整することもできます。Configure()
およびConfigureServices()
メソッドは、Configure{EnvironmentName}()
およびConfigure{EnvironmentName}Services()
という形式のStartup
クラス自体に類似した環境固有のバージョンをサポートします。メソッドConfigureDevelopment()
を定義すると、環境が開発に設定されているときにConfigure()
の代わりに呼び出されます。同様に、同じ環境でConfigureDevelopmentServices()
の代わりにConfigureServices()
が呼び出されます。
.NET Core 2.0
MVCアプリ/ 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());
}
});
......
}
}
これは、次のように追加のプロパティやメソッドパラメータなしで実現できます。
public void ConfigureServices(IServiceCollection services)
{
IServiceProvider serviceProvider = services.BuildServiceProvider();
IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();
if (env.IsProduction()) DoSomethingDifferentHere();
}
ホスティング環境は、起動時にIHostingEnvironment.IsEnvironment拡張メソッド、またはIsDevelopmentまたはIsProductionの対応する便利なメソッドのいずれかを使用して使用できるASPNET_ENV環境変数から取得されます。 Startup()またはConfigureServices呼び出しで必要なものを保存します。
var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");
サービスの1つで環境を取得したかった。本当に簡単です!次のようにコンストラクタに注入します。
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.
}
Configureおよび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
}
IHostingEnvironmentに簡単にアクセスできないコードベースのどこかでこれをテストする必要がある場合、別の簡単な方法は次のとおりです。
bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";
Dotnet Core 2.0では、Startup-constructorはIConfiguration-parameterのみを想定しています。
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
ホスティング環境の読み方は? ConfigureAppConfiguration中にプログラムクラスに保存します(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();
}