web-dev-qa-db-ja.com

環境名(IHostingEnvironment.EnvironmentName)を設定する方法は?

デフォルトの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を設定する方法は何ですか?

サーバーのパラメーターとして「コマンド」で設定する必要があると想像できます。

62
tsdaemon

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"
      }
    }
  }
}
14
clark wu

RC2の後

それでは、異なるEnvironmentNameを設定する方法は何ですか?

ASPNETCORE_ENVIRONMENT環境変数を設定します。

その環境変数を設定するには多くの方法があります。これらには、launchSettings.jsonプロファイルと 他の環境固有の方法 が含まれます。下記は用例です。

コンソールから:

// PowerShell
> $env:ASPNETCORE_ENVIRONMENT="Development"

// Windows Command Line
> SET ASPNETCORE_ENVIRONMENT=Development

// Bash
> ASPNETCORE_ENVIRONMENT=Development

Azure Webアプリのアプリ設定から:

Set Environment Name in Azure

RC2の前

サーバーのパラメーターとして「コマンド」で設定する必要があると想像できます。

それは本当です。 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_ENVproductionになります。

関連するASP.NET Coreホスティングソースコード

WebHostBuilder"ASPNETCORE_"WebHostDefaults.EnvironmentKeyを組み合わせて"ASPNETCORE_environment"を作成します。また、レガシーキーもサポートしています。

WebHostDefaults.cs

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";
    }
}

WebHostBuilder.cs

_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」です そしてここで設定されます

69
Shaun Luttin

環境を設定するには、ASPNET_ENVという名前の環境変数を定義します。たとえば、Release SET ASPNET_ENV=Releaseが必要な場合。

ASPNET_ENV=Releaseをパラメーターとしてコマンドに渡すと動作する場合もありますが、今は確認できません。

実装方法は次のとおりです: https://github.com/aspnet/Hosting/blob/217f9ca3d3ccf59ea06e6555820974ba9c3b5932/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs

16

同じ問題がありました。環境変数と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変数を設定する必要があります。

enter image description here

その結果、対応するプロジェクトのPropertiesフォルダーにlaunchSettings.jsonファイルが作成(または更新)されるため、簡単にこのファイルをソース管理ソリューションに保持し、開発者間で共有します(SET/SETXコマンドを使用する他のソリューションとは異なります)

注:デフォルトでは、最新のASP.NET Coreは環境をProductionに設定します。したがって、デバッグのためにVSでASPNETCORE_ENVIRONMENTDevelopmentに設定するだけです(上記のスクリーンショットを参照)。確かに、ステージング環境でコードをローカルで実行する場合は、ASPNETCORE_ENVIRONMENTStagingに設定する必要があります。そして最後に、実稼働環境で実行する場合は、この変数を削除するか、値をProductionに設定します。

まとめると:DevelopmentStagingまたは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);
    }
  }
}
6
Evereq

ASP.NET Core RC2では、変数名がASPNETCORE_ENVIRONMENTに変更されました

例えばWindowsでは、ステージングサーバーでこのコマンドを実行できます(管理者権限を持つ)

SETX ASPNETCORE_ENVIRONMENT "Staging" /M

これは一度だけ実行され、その後はサーバーは常にステージングサーバーと見なされます。

そのサーバーのコマンドプロンプトでdotnet runを実行すると、Hosting environment: Stagingが表示されます

4
Rubanov

この値をどこから取得するかを考えている場合は、この瞬間は静的であり、デフォルト値は開発です。

https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs

IHostingEnviroment変数タイプを見ると、Microsoft.AspNet.Hosting.HostingEnvriomentです。

動的構成ごとに変更できる方法は2つあります。

  1. IHostingEnvironmentインターフェイスを実装し、そのために独自のタイプを使用できます。構成ファイルから値を読み取ることができます。

  2. インターフェースを使用できますここでその変数を直接更新できます。

    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の上に設定して、その値を読み取ることができます。

https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs

3
dotnetstep
  1. Azureでは、Webアプリの構成ページでASPNET_ENV環境変数を設定するだけです。

  2. 独自の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>
    
  3. 開発中(ソースコードを変更できる場合)、プロジェクトのルートにMicrosoft.AspNet.Hosting.jsonという名前のファイルを作成し、ASPNET_ENV変数を設定することもできます。

    {"ASPNET_ENV": "テスト"}

3

コードを変更せずにこれを設定する必要がある場合-プロジェクトソースフォルダーのルートにあるコマンドプロンプトから:

set ASPNET_ENV=Debug
2
Andrew Smith

VsCode で、launch.jsonに以下を追加します

{
    "version": "0.2.0",
    "configurations": [
        {
            ...
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            }
        },
        ...
    ]
}
0
Tim Abell

VS2017で設定するもう1つの方法およびASPNETCORE_ENVIRONMENT変数を切り替えるを示します(@ clark-wuの回答への追加メモ)。

enter image description here

注:私の場合、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になります。

0
Anton Lyhin