ASP.NET Core でのアプリケーションのスタートアップApp startup in ASP.NET Core

作成者: Tom DykstraLuke LathamSteve SmithBy Tom Dykstra, Luke Latham, and Steve Smith

Startup クラスはサービスとアプリケーションの要求パイプラインを構成します。The Startup class configures services and the app's request pipeline.

Startup クラスThe Startup class

ASP.NET Core アプリケーションでは Startup クラスが使用されています。このクラスは規約に従って Startup と名前が付けられています。ASP.NET Core apps use a Startup class, which is named Startup by convention. Startup クラス:The Startup class:

  • 必要に応じて ConfigureServices メソッドを含め、アプリのサービスを構成することができます。Optionally includes a ConfigureServices method to configure the app's services. サービスとは、アプリ機能を提供する再利用可能なコンポーネントです。A service is a reusable component that provides app functionality. サービスは ConfigureServices で構成され (—登録と表現されることもあります—)、依存関係の挿入 (DI) または ApplicationServices を介してアプリ全体で利用されます。Services are configured—also described as registered—in ConfigureServices and consumed across the app via dependency injection (DI) or ApplicationServices.
  • アプリの要求処理パイプラインを作成するために Configure メソッドを含めます。Includes a Configure method to create the app's request processing pipeline.

ConfigureServicesConfigure はアプリの起動時に ASP.NET Core ランタイムによって呼び出されます。ConfigureServices and Configure are called by the ASP.NET Core runtime when the app starts:

public class Startup
{
    // Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    }

    // Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
        ...
    }
}

アプリのStartupホストがビルドされるとき、 クラスがアプリに指定されます。The Startup class is specified to the app when the app's host is built. Program クラスのホスト ビルダーで Build が呼び出されるとき、アプリのホストがビルドされます。The app's host is built when Build is called on the host builder in the Program class. Startup クラスは通常、ホスト ビルダーで WebHostBuilderExtensions.UseStartup<TStartup> メソッドを呼び出すことで指定されます。The Startup class is usually specified by calling the WebHostBuilderExtensions.UseStartup<TStartup> method on the host builder:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

ホストには、Startup クラス コンストラクターで使用できるサービスが用意されています。The host provides services that are available to the Startup class constructor. アプリケーションから ConfigureServices 経由でサービスが追加されます。The app adds additional services via ConfigureServices. これで、ホスト サービスとアプリケーション サービスの両方が Configure 内とアプリ全体で使用できるようになります。Both the host and app services are then available in Configure and throughout the app.

Startup クラスへの依存関係挿入の一般的な用途は、以下を挿入する場合です。A common use of dependency injection into the Startup class is to inject:

public class Startup
{
    private readonly IHostingEnvironment _env;
    private readonly IConfiguration _config;
    private readonly ILoggerFactory _loggerFactory;

    public Startup(IHostingEnvironment env, IConfiguration config, 
        ILoggerFactory loggerFactory)
    {
        _env = env;
        _config = config;
        _loggerFactory = loggerFactory;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var logger = _loggerFactory.CreateLogger<Startup>();

        if (_env.IsDevelopment())
        {
            // Development service configuration

            logger.LogInformation("Development environment");
        }
        else
        {
            // Non-development service configuration

            logger.LogInformation($"Environment: {_env.EnvironmentName}");
        }

        // Configuration is available during startup.
        // Examples:
        //   _config["key"]
        //   _config["subsection:suboption1"]
    }
}

IHostingEnvironment を挿入する代わりに、規約ベースのアプローチがあります。An alternative to injecting IHostingEnvironment is to use a conventions-based approach. アプリケーションの環境 (たとえば StartupDevelopment) ごとに個別の Startup クラスが定義されると、実行時に適切な Startup クラスが選択されます。When the app defines separate Startup classes for different environments (for example, StartupDevelopment), the appropriate Startup class is selected at runtime. 名前のサフィックスが現在の環境と一致するクラスが優先されます。The class whose name suffix matches the current environment is prioritized. アプリケーションが Development 環境で実行され、Startup クラスと StartupDevelopment クラスの両方が含まれている場合は、StartupDevelopment クラスが使用されます。If the app is run in the Development environment and includes both a Startup class and a StartupDevelopment class, the StartupDevelopment class is used. 詳細については、「Use multiple environments」(複数の環境の使用) を参照してください。For more information, see Use multiple environments.

ホストの詳細については、「ホスト」を参照してください。To learn more about the host, see The host. スタートアップ時のエラー処理については、「Startup exception handling」(スタートアップ例外処理) を参照してください。For information on handling errors during startup, see Startup exception handling.

ConfigureServices メソッドThe ConfigureServices method

ConfigureServices メソッド:The ConfigureServices method is:

  • 任意。Optional.
  • アプリケーションのサービスを構成する Configure メソッドの前にホストによって呼び出されます。Called by the host before the Configure method to configure the app's services.
  • 規約によって構成オプションが設定されます。Where configuration options are set by convention.

一般的なパターンとしては、すべての Add{Service} メソッドを呼び出した後にすべての services.Configure{Service} メソッドを呼び出します。The typical pattern is to call all the Add{Service} methods and then call all of the services.Configure{Service} methods. たとえば、Identity サービスの構成に関する記事をご覧ください。For example, see Configure Identity services.

ホストでは、Startup メソッドが呼び出される前にいくつかのサービスを構成することができます。The host may configure some services before Startup methods are called. 詳細については、「ホスト」を参照してください。For more information, see The host.

多くの設定が必要な機能には、IServiceCollection 上の Add{Service} 拡張メソッドがあります。For features that require substantial setup, there are Add{Service} extension methods on IServiceCollection. 一般的な ASP.NET Core アプリは、Entity Framework、Identity、および MVC のサービスを登録します。A typical ASP.NET Core app registers services for Entity Framework, Identity, and MVC:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

サービス コンテナーにサービスを追加すると、アプリケーション内と Configure メソッド内でサービスを利用できるようになります。Adding services to the service container makes them available within the app and in the Configure method. サービスは依存関係の挿入または ApplicationServices によって解決されます。The services are resolved via dependency injection or from ApplicationServices.

SetCompatibilityVersion について詳しくは、「SetCompatibilityVersion」をご覧ください。See SetCompatibilityVersion for more information on SetCompatibilityVersion.

Configure メソッドThe Configure method

Configure メソッドは、アプリケーションが HTTP 要求にどのように応答するかを指定するために使用されます。The Configure method is used to specify how the app responds to HTTP requests. 要求パイプラインは、ミドルウェア コンポーネントを IApplicationBuilder インスタンスに追加することで構成されます。The request pipeline is configured by adding middleware components to an IApplicationBuilder instance. IApplicationBuilderConfigure メソッドから使用できますが、サービス コンテナーに登録されていません。IApplicationBuilder is available to the Configure method, but it isn't registered in the service container. ホスティングによって IApplicationBuilder が作成され、Configure に直接渡されます。Hosting creates an IApplicationBuilder and passes it directly to Configure.

ASP.NET Core テンプレートでは、次をサポートするパイプラインが構成されます。The ASP.NET Core templates configure the pipeline with support for:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

Use 拡張メソッドによって、要求パイプラインに 1 つまたは複数のミドルウェア コンポーネントが追加されます。Each Use extension method adds one or more middleware components to the request pipeline. たとえば、UseMvc 拡張メソッドでは、ルーティング ミドルウェアが要求パイプラインに追加され、既定のハンドラーとして MVC が構成されます。For instance, the UseMvc extension method adds Routing Middleware to the request pipeline and configures MVC as the default handler.

要求パイプライン内の各ミドルウェア コンポーネントは、パイプラインの次のコンポーネントを呼び出すか、妥当な場合はチェーンをショートさせます。Each middleware component in the request pipeline is responsible for invoking the next component in the pipeline or short-circuiting the chain, if appropriate. ショート サーキットがミドルウェアのチェーンで発生しない場合、各ミドルウェアには、クライアントに送信される前に要求を処理する 2 度目の機会があります。If short-circuiting doesn't occur along the middleware chain, each middleware has a second chance to process the request before it's sent to the client.

また、IHostingEnvironmentILoggerFactory などの追加サービスを Configure メソッド シグネチャで指定することもできます。Additional services, such as IHostingEnvironment and ILoggerFactory, may also be specified in the Configure method signature. 指定すると、(使用可能なサービスの場合) 追加サービスが挿入されます。When specified, additional services are injected if they're available.

IApplicationBuilder の使用方法およびミドルウェアの処理の順序については、「ASP.NET Core のミドルウェア」を参照してください。For more information on how to use IApplicationBuilder and the order of middleware processing, see ASP.NET Core のミドルウェア.

簡易メソッドConvenience methods

Startup クラスを使用せず、サービスと要求処理パイプラインを構成するには、ホスト ビルダーで便利なメソッド、ConfigureServicesConfigure を呼び出します。To configure services and the request processing pipeline without using a Startup class, call ConfigureServices and Configure convenience methods on the host builder. ConfigureServices の複数回の呼び出しでは、互いに追加されます。Multiple calls to ConfigureServices append to one another. Configure メソッドが複数回呼び出された場合、最後の Configure 呼び出しが使用されます。If multiple Configure method calls exist, the last Configure call is used.

public class Program
{
    public static IHostingEnvironment HostingEnvironment { get; set; }
    public static IConfiguration Configuration { get; set; }

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureServices(services =>
            {
                ...
            })
            .Configure(app =>
            {
                var loggerFactory = app.ApplicationServices
                    .GetRequiredService<ILoggerFactory>();
                var logger = loggerFactory.CreateLogger<Program>();
                var env = app.ApplicationServices.GetRequiredServices<IHostingEnvironment>();
                var config = app.ApplicationServices.GetRequiredServices<IConfiguration>();

                logger.LogInformation("Logged in Configure");

                if (env.IsDevelopment())
                {
                    ...
                }
                else
                {
                    ...
                }

                var configValue = config["subsection:suboption1"];

                ...
            });
}

スタートアップ フィルターを使用した Startup の拡張Extend Startup with startup filters

IStartupFilter を使用して、アプリケーションの Configure ミドルウェア パイプラインの先頭または末尾でミドルウェアを構成します。Use IStartupFilter to configure middleware at the beginning or end of an app's Configure middleware pipeline. IStartupFilter は、アプリケーションの要求処理パイプラインの先頭または末尾で、ライブラリによってミドルウェアが追加される前または後にミドルウェアを確実に実行する場合に便利です。IStartupFilter is useful to ensure that a middleware runs before or after middleware added by libraries at the start or end of the app's request processing pipeline.

IStartupFilter は、Action<IApplicationBuilder> を受け取って返す 1 つのメソッド Configure を実装しています。IStartupFilter implements a single method, Configure, which receives and returns an Action<IApplicationBuilder>. IApplicationBuilder で、アプリケーションの要求パイプラインを構成するクラスを定義します。An IApplicationBuilder defines a class to configure an app's request pipeline. 詳細については、「Create a middleware pipeline with IApplicationBuilder」(IApplicationBuilder を使用したミドルウェア パイプラインの作成) を参照してください。For more information, see Create a middleware pipeline with IApplicationBuilder.

IStartupFilter は、要求パイプラインで 1 つまたは複数のミドルウェアを実装します。Each IStartupFilter implements one or more middlewares in the request pipeline. フィルターは、サービス コンテナーに追加された順に呼び出されます。The filters are invoked in the order they were added to the service container. フィルターは、コントロールを次のフィルターに渡す前または後にミドルウェアを追加できるため、アプリケーション パイプラインの先頭または末尾に追加されます。Filters may add middleware before or after passing control to the next filter, thus they append to the beginning or end of the app pipeline.

IStartupFilter でミドルウェアを登録する方法を次の例に示します。The following example demonstrates how to register a middleware with IStartupFilter.

RequestSetOptionsMiddleware ミドルウェアによって、クエリ文字列パラメーターからオプション値が設定されます。The RequestSetOptionsMiddleware middleware sets an options value from a query string parameter:

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;
    private IOptions<AppOptions> _injectedOptions;

    public RequestSetOptionsMiddleware(
        RequestDelegate next, IOptions<AppOptions> injectedOptions)
    {
        _next = next;
        _injectedOptions = injectedOptions;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        Console.WriteLine("RequestSetOptionsMiddleware.Invoke");

        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            _injectedOptions.Value.Option = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

RequestSetOptionsMiddlewareRequestSetOptionsStartupFilter クラスで構成されています。The RequestSetOptionsMiddleware is configured in the RequestSetOptionsStartupFilter class:

public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

IStartupFilterConfigureServices のサービス コンテナーに登録され、Startup クラスの外側から Startup を補強します。The IStartupFilter is registered in the service container in ConfigureServices and augments Startup from outside of the Startup class:

WebHost.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddTransient<IStartupFilter, 
            RequestSetOptionsStartupFilter>();
    })
    .UseStartup<Startup>()
    .Build();

option のクエリ文字列パラメーターを指定すると、ミドルウェアは MVC ミドルウェアが応答をレンダリングする前に値の割り当てを処理します。When a query string parameter for option is provided, the middleware processes the value assignment before the MVC middleware renders the response:

レンダリングされたインデックス ページを表示するブラウザー ウィンドウ。

ミドルウェアの実行順序は、IStartupFilter の登録順に設定されています。Middleware execution order is set by the order of IStartupFilter registrations:

  • 複数の IStartupFilter の実装が、同じオブジェクトとやり取りする可能性があります。Multiple IStartupFilter implementations may interact with the same objects. 順序が重要な場合は、ミドルウェアの実行順序に合わせて IStartupFilter サービスの登録順序を指定してください。If ordering is important, order their IStartupFilter service registrations to match the order that their middlewares should run.
  • IStartupFilter に登録された他のアプリケーション ミドルウェアの前または後に実行される IStartupFilter の実装が 1 つまたは複数あるミドルウェアを、ライブラリで追加することができます。Libraries may add middleware with one or more IStartupFilter implementations that run before or after other app middleware registered with IStartupFilter. ライブラリの IStartupFilter によって追加されたミドルウェアの前に IStartupFilter ミドルウェアを呼び出すには、ライブラリがサービス コンテナーに追加される前にサービスの登録を配置します。To invoke an IStartupFilter middleware before a middleware added by a library's IStartupFilter, position the service registration before the library is added to the service container. 後で呼び出すには、ライブラリが追加される後にサービスの登録を配置します。To invoke it afterward, position the service registration after the library is added.

外部アセンブリからの起動時に構成を追加するAdd configuration at startup from an external assembly

IHostingStartup の実装により、アプリの Startup クラスの外部にある外部アセンブリから、起動時に拡張機能をアプリに追加できるようになります。An IHostingStartup implementation allows adding enhancements to an app at startup from an external assembly outside of the app's Startup class. 詳細については、「ASP.NET Core でホスティング スタートアップ アセンブリを使用する」を参照してください。For more information, see ASP.NET Core でホスティング スタートアップ アセンブリを使用する.

その他の技術情報Additional resources