web-dev-qa-db-ja.com

ConfigureServicesで開発/ステージング/運用ホスティング環境を取得する方法

スタートアップのConfigureServicesメソッドで開発/ステージング/運用ホスティング環境を取得するにはどうすればよいですか?

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

ConfigureServicesメソッドは、単一のIServiceCollectionパラメーターのみを取ります。

100

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...
}
133
Joe Audette

TL; DR

ASPNETCORE_ENVIRONMENTという名前の環境変数に環境の名前を設定します(例:Production)。次に、次の2つのいずれかを実行します。

  • IHostingEnvironmentStartup.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()が呼び出されます。

39
vaindil

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

        ......
    }
}
15
David Liang

これは、次のように追加のプロパティやメソッドパラメータなしで実現できます。

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

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

ホスティング環境は、起動時にIHostingEnvironment.IsEnvironment拡張メソッド、またはIsDevelopmentまたはIsProductionの対応する便利なメソッドのいずれかを使用して使用できるASPNET_ENV環境変数から取得されます。 Startup()またはConfigureServices呼び出しで必要なものを保存します。

var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");
5
Jeff Dunlop

サービスの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.
}
3
Jess

docs

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
}
3
Shoe

IHostingEnvironmentに簡単にアクセスできないコードベースのどこかでこれをテストする必要がある場合、別の簡単な方法は次のとおりです。

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

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