デフォルトのASP.NET Core Webプロジェクトには、Startup.cs
:
if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage(ErrorPageOptions.ShowAll);
}
else
{
app.UseExceptionHandler("/Home/Error");
}
私が理解しているように、EnvironmentNameは開発/生産環境を処理するための新しい方法です。ただし、リリースビルド構成では変更されません。それでは、異なるEnvironmentName
を設定する方法は何ですか?
サーバーのパラメーターとして「コマンド」で設定する必要があると想像できます。
launchsettings.json
プロパティ> launchsettings.jsonで
ちょうどこのような:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:1032/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
},
"WebAppNetCore": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"web": {
"commandName": "web",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
それでは、異なるEnvironmentNameを設定する方法は何ですか?
ASPNETCORE_ENVIRONMENT
環境変数を設定します。
その環境変数を設定するには多くの方法があります。これらには、launchSettings.json
プロファイルと 他の環境固有の方法 が含まれます。下記は用例です。
コンソールから:
// PowerShell
> $env:ASPNETCORE_ENVIRONMENT="Development"
// Windows Command Line
> SET ASPNETCORE_ENVIRONMENT=Development
// Bash
> ASPNETCORE_ENVIRONMENT=Development
Azure Webアプリのアプリ設定から:
サーバーのパラメーターとして「コマンド」で設定する必要があると想像できます。
それは本当です。 project.jsonで、--ASPNET_ENV production
をサーバーのパラメーターとして追加します。
"commands": {
"web": "Microsoft.AspNet.Hosting --ASPNET_ENV production --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001"
}
これで、コマンドラインからdnx . web
を実行すると、ASPNET_ENV
はproduction
になります。
WebHostBuilder
は"ASPNETCORE_"
とWebHostDefaults.EnvironmentKey
を組み合わせて"ASPNETCORE_environment"
を作成します。また、レガシーキーもサポートしています。
namespace Microsoft.AspNetCore.Hosting
{
public static class WebHostDefaults
{
public static readonly string ApplicationKey = "applicationName";
public static readonly string StartupAssemblyKey = "startupAssembly";
public static readonly string DetailedErrorsKey = "detailedErrors";
public static readonly string EnvironmentKey = "environment";
public static readonly string WebRootKey = "webroot";
public static readonly string CaptureStartupErrorsKey = "captureStartupErrors";
public static readonly string ServerUrlsKey = "urls";
public static readonly string ContentRootKey = "contentRoot";
}
}
_config = new ConfigurationBuilder()
.AddEnvironmentVariables(prefix: "ASPNETCORE_")
.Build();
if (string.IsNullOrEmpty(GetSetting(WebHostDefaults.EnvironmentKey)))
{
// Try adding legacy environment keys, never remove these.
UseSetting(WebHostDefaults.EnvironmentKey,
Environment.GetEnvironmentVariable("Hosting:Environment")
?? Environment.GetEnvironmentVariable("ASPNET_ENV"));
}
環境キーは、
ASPNETCORE_ENVIRONMENT
環境変数で設定されます。ASPNET_ENV
およびHosting:Environment
は引き続きサポートされていますが、非推奨のメッセージ警告が生成されます。
https://docs.asp.net/en/latest/migration/rc1-to-rtm.html
デフォルト値は「Production」です そしてここで設定されます
環境を設定するには、ASPNET_ENV
という名前の環境変数を定義します。たとえば、Release SET ASPNET_ENV=Release
が必要な場合。
ASPNET_ENV=Release
をパラメーターとしてコマンドに渡すと動作する場合もありますが、今は確認できません。
同じ問題がありました。環境変数とweb.configに依存しないように、.jsonファイルを作成しました(envsettings.json):
{
// Possible string values reported below.
// - Production
// - Staging
// - Development
"ASPNETCORE_ENVIRONMENT": "Staging"
}
次に、Program.csに追加しました:
public class Program
{
public static void Main(string[] args)
{
var currentDirectoryPath = Directory.GetCurrentDirectory();
var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();
var webHostBuilder = new WebHostBuilder()
.UseKestrel()
.CaptureStartupErrors(true)
.UseSetting("detailedErrors", "true")
.UseContentRoot(currentDirectoryPath)
.UseIISIntegration()
.UseStartup<Startup>();
// If none is set it use Operative System hosting enviroment
if (!string.IsNullOrWhiteSpace(enviromentValue))
{
webHostBuilder.UseEnvironment(enviromentValue);
}
var Host = webHostBuilder.Build();
Host.Run();
}
}
VS機能(VS 2017など)を使用する場合は、プロジェクトプロパティの[デバッグ]タブで環境変数を追加できます。たとえば、最新のASP.NET Coreバージョン(RC2以降)では、ASPNETCORE_ENVIRONMENT
変数を設定する必要があります。
その結果、対応するプロジェクトのPropertiesフォルダーにlaunchSettings.json
ファイルが作成(または更新)されるため、簡単にこのファイルをソース管理ソリューションに保持し、開発者間で共有します(SET
/SETX
コマンドを使用する他のソリューションとは異なります)
注:デフォルトでは、最新のASP.NET Coreは環境をProductionに設定します。したがって、デバッグのためにVSでASPNETCORE_ENVIRONMENT
をDevelopment
に設定するだけです(上記のスクリーンショットを参照)。確かに、ステージング環境でコードをローカルで実行する場合は、ASPNETCORE_ENVIRONMENT
をStaging
に設定する必要があります。そして最後に、実稼働環境で実行する場合は、この変数を削除するか、値をProduction
に設定します。
まとめると:Development、StagingまたはProduction値は、環境を設定し、さまざまな拡張機能を機能させるために、[デバッグ]ダイアログで( 'Dev'またはその他のものではなく)使用されます。
ASP.NET Coreの関連ソースコードも参照してください。
namespace Microsoft.AspNetCore.Hosting
{
/// <summary>Commonly used environment names.</summary>
public static class EnvironmentName
{
public static readonly string Development = "Development";
public static readonly string Staging = "Staging";
public static readonly string Production = "Production";
}
}
namespace Microsoft.AspNetCore.Hosting
{
/// <summary>
/// Extension methods for <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.
/// </summary>
public static class HostingEnvironmentExtensions
{
/// <summary>
/// Checks if the current hosting environment name is "Development".
/// </summary>
/// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
/// <returns>True if the environment name is "Development", otherwise false.</returns>
public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment)
{
if (hostingEnvironment == null)
throw new ArgumentNullException("hostingEnvironment");
return hostingEnvironment.IsEnvironment(EnvironmentName.Development);
}
/// <summary>
/// Checks if the current hosting environment name is "Staging".
/// </summary>
/// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
/// <returns>True if the environment name is "Staging", otherwise false.</returns>
public static bool IsStaging(this IHostingEnvironment hostingEnvironment)
{
if (hostingEnvironment == null)
throw new ArgumentNullException("hostingEnvironment");
return hostingEnvironment.IsEnvironment(EnvironmentName.Staging);
}
/// <summary>
/// Checks if the current hosting environment name is "Production".
/// </summary>
/// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
/// <returns>True if the environment name is "Production", otherwise false.</returns>
public static bool IsProduction(this IHostingEnvironment hostingEnvironment)
{
if (hostingEnvironment == null)
throw new ArgumentNullException("hostingEnvironment");
return hostingEnvironment.IsEnvironment(EnvironmentName.Production);
}
/// <summary>
/// Compares the current hosting environment name against the specified value.
/// </summary>
/// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
/// <param name="environmentName">Environment name to validate against.</param>
/// <returns>True if the specified name is the same as the current environment, otherwise false.</returns>
public static bool IsEnvironment(this IHostingEnvironment hostingEnvironment, string environmentName)
{
if (hostingEnvironment == null)
throw new ArgumentNullException("hostingEnvironment");
return string.Equals(hostingEnvironment.EnvironmentName, environmentName, StringComparison.OrdinalIgnoreCase);
}
}
}
ASP.NET Core RC2
では、変数名がASPNETCORE_ENVIRONMENT
に変更されました
例えばWindowsでは、ステージングサーバーでこのコマンドを実行できます(管理者権限を持つ)
SETX ASPNETCORE_ENVIRONMENT "Staging" /M
これは一度だけ実行され、その後はサーバーは常にステージングサーバーと見なされます。
そのサーバーのコマンドプロンプトでdotnet run
を実行すると、Hosting environment: Staging
が表示されます
この値をどこから取得するかを考えている場合は、この瞬間は静的であり、デフォルト値は開発です。
https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs
IHostingEnviroment変数タイプを見ると、Microsoft.AspNet.Hosting.HostingEnvriomentです。
動的構成ごとに変更できる方法は2つあります。
IHostingEnvironmentインターフェイスを実装し、そのために独自のタイプを使用できます。構成ファイルから値を読み取ることができます。
インターフェースを使用できますここでその変数を直接更新できます。
public Startup(IHostingEnvironment env)
{
// Setup configuration sources.
Configuration = new Configuration()
.AddJsonFile("config.json").AddEnvironmentVariables();
Configuration.Set("ASPNET_ENV","Your own value");
}
ConfigureServicesのサービスを見ると、デフォルトで設定されているサービスのリストがあり、そのうちの1つがIConfigureHostingEnviromentです。デフォルトの実装は内部クラスなので、直接アクセスすることはできませんが、キーASPNET_ENVの上に設定して、その値を読み取ることができます。
Azureでは、Webアプリの構成ページでASPNET_ENV環境変数を設定するだけです。
独自のIISまたは他のホスティングプロバイダー-web.configを変更して、「web」コマンドの引数を含める:
<configuration>
<system.webServer>
<handlers>
<add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
</handlers>
<httpPlatform processPath="..\approot\web.cmd" arguments="--ASPNET_ENV Development" stdoutLogEnabled="false" stdoutLogFile="..\logs\stdout.log" startupTimeLimit="3600"></httpPlatform>
</system.webServer>
</configuration>
開発中(ソースコードを変更できる場合)、プロジェクトのルートにMicrosoft.AspNet.Hosting.jsonという名前のファイルを作成し、ASPNET_ENV変数を設定することもできます。
{"ASPNET_ENV": "テスト"}
コードを変更せずにこれを設定する必要がある場合-プロジェクトソースフォルダーのルートにあるコマンドプロンプトから:
set ASPNET_ENV=Debug
VsCode で、launch.jsonに以下を追加します
{
"version": "0.2.0",
"configurations": [
{
...
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
...
]
}
VS2017で設定するもう1つの方法およびASPNETCORE_ENVIRONMENT変数を切り替えるを示します(@ clark-wuの回答への追加メモ)。
注:私の場合、launchSettings.jsonには、ASPNETCORE_ENVIRONMENTが定義されている「IISExpress」と「Project」という2つのプロファイルがあります。
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:10000/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "api/entities",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" // <-- related to IIS Express profile
}
},
"Project": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "api/entities",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production" // <-- related to Project profile
},
"applicationUrl": "http://localhost:10000/"
}
}
}
公式ドキュメント :ASPNETCORE_ENVIRONMENTを任意の値に設定できますが、フレームワークでは開発、ステージング、および本番の3つの値がサポートされています。 ASPNETCORE_ENVIRONMENTが設定されていない場合、デフォルトでProductionになります。