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

注意

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

作成者: Rick Anderson

Web テンプレートを使用して作成した ASP.NET Core アプリでは、Program.cs ファイルにアプリケーション スタートアップ コードが入っています。

以下をサポートするアプリ スタートアップ コードを示します。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

EventSource を使用するアプリでは、起動時間を測定して起動時のパフォーマンスを把握し、最適化できます。 Microsoft.AspNetCore.HostingServerReady イベントは、サーバーが要求に応答する準備ができているポイントを表します。

アプリケーションの起動の詳細については、「ASP.NET Core の基礎の概要」を参照してください。

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

IStartupFilter を使用して次のことを行います。

  • Use{Middleware} を明示的に呼び出さずに、アプリのミドルウェア パイプラインの先頭または末尾でミドルウェアを構成するには。 IStartupFilter を使用し、既定のミドルウェアを明示的に登録せず、パイプラインの先頭に既定値を追加します。 IStartupFilter により、アプリの作成者に代わって別のコンポーネントが Use{Middleware} を呼び出すことを許可します。
  • Configure メソッドのパイプラインを作成します。 IStartupFilter.Configure では、ライブラリによって追加されたミドルウェアの前後に実行するように、ミドルウェアを設定することができます。

IStartupFilter には、Action<IApplicationBuilder> を受け取って返す Configure が実装されています。 IApplicationBuilder で、アプリケーションの要求パイプラインを構成するクラスを定義します。 詳細については、「Create a middleware pipeline with IApplicationBuilder」(IApplicationBuilder を使用したミドルウェア パイプラインの作成) を参照してください。

IStartupFilter によって、要求パイプラインで 1 つまたは複数のミドルウェアを追加できます。 フィルターは、サービス コンテナーに追加された順に呼び出されます。 フィルターは、コントロールを次のフィルターに渡す前または後にミドルウェアを追加できるため、アプリケーション パイプラインの先頭または末尾に追加されます。

IStartupFilter でミドルウェアを登録する方法を次の例に示します。 RequestSetOptionsMiddleware ミドルウェアによって、クエリ文字列パラメーターからオプション値が設定されます。

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

RequestSetOptionsMiddlewareRequestSetOptionsStartupFilter クラスで構成されています。

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

IStartupFilterProgram.cs に登録されます。

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

option のクエリ文字列パラメーターを指定すると、ミドルウェアでは ASP.NET Core ミドルウェアによって応答がレンダリングされる前に値の割り当てを処理します。

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

ミドルウェアの実行順序は、IStartupFilter の登録順に設定されています。

  • 複数の IStartupFilter の実装が、同じオブジェクトとやり取りする可能性があります。 順序が重要な場合は、ミドルウェアの実行順序に合わせて IStartupFilter サービスの登録順序を指定してください。

  • IStartupFilter に登録された他のアプリケーション ミドルウェアの前または後に実行される IStartupFilter の実装が 1 つまたは複数あるミドルウェアを、ライブラリで追加することができます。 ライブラリの IStartupFilter よって追加されたミドルウェアの前に IStartupFilter ミドルウェアを呼び出すには、次のようにします。

    • サービス コンテナーにライブラリを追加する前に、サービス登録を配置する
    • 後で呼び出すために、ライブラリが追加された後にサービス登録を配置する

注: Configure をオーバーライドするとき、ASP.NET Core アプリを拡張することはできません。 詳細については、こちらの GitHub issue を参照してください。

外部アセンブリからの起動時に構成を追加する

IHostingStartup の実装により、アプリの Program.cs ファイルの外部にある外部アセンブリから、起動時に拡張機能をアプリに追加できるようになります。 詳細については、「ASP.NET Core でホスティング スタートアップ アセンブリを使用する」を参照してください。

Startup、ConfigureServices、Configure

最小限のホスティング モデルで ConfigureServices メソッドと Configure メソッドを使用する方法の詳細については、以下を参照してください。

Web テンプレートを使用して作成した ASP.NET Core アプリでは、Program.cs ファイルにアプリケーション スタートアップ コードが入っています。

以下をサポートするアプリ スタートアップ コードを示します。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseAuthorization();

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

アプリケーションの起動の詳細については、「ASP.NET Core の基礎の概要」を参照してください。

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

IStartupFilter を使用して次のことを行います。

  • Use{Middleware} を明示的に呼び出さずに、アプリのミドルウェア パイプラインの先頭または末尾でミドルウェアを構成するには。 IStartupFilter を使用し、既定のミドルウェアを明示的に登録せず、パイプラインの先頭に既定値を追加します。 IStartupFilter により、アプリの作成者に代わって別のコンポーネントが Use{Middleware} を呼び出すことを許可します。
  • Configure メソッドのパイプラインを作成します。 IStartupFilter.Configure では、ライブラリによって追加されたミドルウェアの前後に実行するように、ミドルウェアを設定することができます。

IStartupFilter には、Action<IApplicationBuilder> を受け取って返す Configure が実装されています。 IApplicationBuilder で、アプリケーションの要求パイプラインを構成するクラスを定義します。 詳細については、「Create a middleware pipeline with IApplicationBuilder」(IApplicationBuilder を使用したミドルウェア パイプラインの作成) を参照してください。

IStartupFilter によって、要求パイプラインで 1 つまたは複数のミドルウェアを追加できます。 フィルターは、サービス コンテナーに追加された順に呼び出されます。 フィルターは、コントロールを次のフィルターに渡す前または後にミドルウェアを追加できるため、アプリケーション パイプラインの先頭または末尾に追加されます。

IStartupFilter でミドルウェアを登録する方法を次の例に示します。 RequestSetOptionsMiddleware ミドルウェアによって、クエリ文字列パラメーターからオプション値が設定されます。

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

RequestSetOptionsMiddlewareRequestSetOptionsStartupFilter クラスで構成されています。

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

IStartupFilterProgram.cs に登録されます。

using WebStartup.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

option のクエリ文字列パラメーターを指定すると、ミドルウェアでは ASP.NET Core ミドルウェアによって応答がレンダリングされる前に値の割り当てを処理します。

@page
@model PrivacyModel
@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p> Append query string ?option=hello</p>
Option String: @HttpContext.Items["option"];

ミドルウェアの実行順序は、IStartupFilter の登録順に設定されています。

  • 複数の IStartupFilter の実装が、同じオブジェクトとやり取りする可能性があります。 順序が重要な場合は、ミドルウェアの実行順序に合わせて IStartupFilter サービスの登録順序を指定してください。

  • IStartupFilter に登録された他のアプリケーション ミドルウェアの前または後に実行される IStartupFilter の実装が 1 つまたは複数あるミドルウェアを、ライブラリで追加することができます。 ライブラリの IStartupFilter よって追加されたミドルウェアの前に IStartupFilter ミドルウェアを呼び出すには、次のようにします。

    • サービス コンテナーにライブラリを追加する前に、サービス登録を配置する
    • 後で呼び出すために、ライブラリが追加された後にサービス登録を配置する

注: Configure をオーバーライドするとき、ASP.NET Core アプリを拡張することはできません。 詳細については、次を参照してください。この GitHub の問題します。

外部アセンブリからの起動時に構成を追加する

IHostingStartup の実装により、アプリの Program.cs ファイルの外部にある外部アセンブリから、起動時に拡張機能をアプリに追加できるようになります。 詳細については、「ASP.NET Core でホスティング スタートアップ アセンブリを使用する」を参照してください。

Startup クラスはサービスとアプリケーションの要求パイプラインを構成します。

Startup クラス

ASP.NET Core アプリケーションでは Startup クラスが使用されています。このクラスは規約に従って Startup と名前が付けられています。 Startup クラス:

  • 必要に応じて ConfigureServices メソッドを含め、アプリのConfigureServicesを構成することができます。 サービスとは、アプリ機能を提供する再利用可能なコンポーネントです。 サービスは ConfigureServices登録され依存関係の挿入 (DI) または ApplicationServices を介してアプリ全体で利用されます。
  • アプリの要求処理パイプラインを作成するために Configure メソッドを含めます。

ConfigureServicesConfigure はアプリの起動時に ASP.NET Core ランタイムによって呼び出されます。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

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

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

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

上記のサンプルは Razor Pages 用です。MVC バージョンは似ています。

アプリのStartupがビルドされるときに、Startup クラスが指定されます。 通常、ホスト ビルダーで WebHostBuilderExtensions.UseStartup/<TStartup> メソッドを呼び出すことによって、Startup クラスは指定されます。

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

ホストには、Startup クラス コンストラクターで使用できるサービスが用意されています。 アプリケーションから ConfigureServices 経由でサービスが追加されます。 ホスト サービスとアプリ サービスの両方が Configure 内とアプリ全体で使用できます。

Startup (IHostBuilder) を使用すると、次のサービスの種類のみを Startup コンストラクターに挿入できます。

public class Startup
{
    private readonly IWebHostEnvironment _env;

    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        _env = env;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
        }
        else
        {
        }
    }
}

ほとんどのサービスは、Configure メソッドが呼び出されるまで使用できません。

マルチ スタートアップ

アプリケーションの環境 (たとえば StartupDevelopment) ごとに個別の Startup クラスが定義されると、実行時に適切な Startup クラスが選択されます。 名前のサフィックスが現在の環境と一致するクラスが優先されます。 アプリケーションが Development 環境で実行され、Startup クラスと StartupDevelopment クラスの両方が含まれている場合は、StartupDevelopment クラスが使用されます。 詳細については、「Use multiple environments」(複数の環境の使用) を参照してください。

ホストの詳細については、「ホスト」を参照してください。 スタートアップ時のエラー処理については、「Startup exception handling」(スタートアップ例外処理) を参照してください。

ConfigureServices メソッド

ConfigureServices メソッド:

  • 任意。
  • アプリケーションのサービスを構成する Configure メソッドの前にホストによって呼び出されます。
  • 規約によって構成オプションが設定されます。

ホストでは、Startup メソッドが呼び出される前にいくつかのサービスを構成することができます。 詳細については、「ホスト」を参照してください。

多くの設定が必要な機能には、IServiceCollection 上の Add{Service} 拡張メソッドがあります。 たとえば、AddDbContext、AddDefaultIdentity、AddEntityFrameworkStores、AddRazorPages です。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>(
            options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        services.AddRazorPages();
    }

サービス コンテナーにサービスを追加すると、アプリケーション内と Configure メソッド内でサービスを利用できるようになります。 サービスは依存関係の挿入または ApplicationServices によって解決されます。

Configure メソッド

Configure メソッドは、アプリケーションが HTTP 要求にどのように応答するかを指定するために使用されます。 要求パイプラインは、ミドルウェア コンポーネントを IApplicationBuilder インスタンスに追加することで構成されます。 IApplicationBuilderConfigure メソッドから使用できますが、サービス コンテナーに登録されていません。 ホスティングによって IApplicationBuilder が作成され、Configure に直接渡されます。

ASP.NET Core テンプレートでは、次をサポートするパイプラインが構成されます。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

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

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

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

上記のサンプルは Razor Pages 用です。MVC バージョンは似ています。

Use 拡張メソッドによって、要求パイプラインに 1 つまたは複数のミドルウェア コンポーネントが追加されます。 たとえば、UseStaticFiles では、静的ファイルを提供するように、UseStaticFilesを構成します。

要求パイプライン内の各ミドルウェア コンポーネントは、パイプラインの次のコンポーネントを呼び出すか、妥当な場合はチェーンをショートさせます。

IWebHostEnvironmentILoggerFactory、または ConfigureServices で定義された任意のものなどの追加サービスを Configure メソッド シグネチャで指定できます。 使用可能な場合、これらのサービスが挿入されます。

IApplicationBuilder の使用方法およびミドルウェアの処理の順序については、「IApplicationBuilder」を参照してください。

スタートアップを使用せずにサービスを構成する

Startup クラスを使用せず、サービスと要求処理パイプラインを構成するには、ホスト ビルダーで便利なメソッド、ConfigureServicesConfigure を呼び出します。 ConfigureServices の複数回の呼び出しでは、互いに追加されます。 Configure メソッドが複数回呼び出された場合、最後の Configure 呼び出しが使用されます。

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    services.AddControllersWithViews();
                })
                .Configure(app =>
                {
                    var loggerFactory = app.ApplicationServices
                        .GetRequiredService<ILoggerFactory>();
                    var logger = loggerFactory.CreateLogger<Program>();
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                    var config = app.ApplicationServices.GetRequiredService<IConfiguration>();

                    logger.LogInformation("Logged in Configure");

                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }
                    else
                    {
                        app.UseExceptionHandler("/Home/Error");
                        app.UseHsts();
                    }

                    var configValue = config["MyConfigKey"];
                });
            });
        });
}

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

IStartupFilter を使用して次のことを行います。

  • Use{Middleware} を明示的に呼び出さずに、アプリの Configure ミドルウェア パイプラインの先頭または末尾でミドルウェアを構成します。 IStartupFilter は、アプリの作成者が既定のミドルウェアを明示的に登録する必要がないよう、パイプラインの先頭に既定値を追加するために、ASP.NET Core によって使用されます。 IStartupFilter により、アプリの作成者に代わって別のコンポーネントが Use{Middleware} を呼び出すことを許可します。
  • Configure メソッドのパイプラインを作成します。 IStartupFilter.Configure では、ライブラリによって追加されたミドルウェアの前後に実行するように、ミドルウェアを設定することができます。

IStartupFilter には、Action<IApplicationBuilder> を受け取って返す Configure が実装されています。 IApplicationBuilder で、アプリケーションの要求パイプラインを構成するクラスを定義します。 詳細については、「Create a middleware pipeline with IApplicationBuilder」(IApplicationBuilder を使用したミドルウェア パイプラインの作成) を参照してください。

IStartupFilter によって、要求パイプラインで 1 つまたは複数のミドルウェアを追加できます。 フィルターは、サービス コンテナーに追加された順に呼び出されます。 フィルターは、コントロールを次のフィルターに渡す前または後にミドルウェアを追加できるため、アプリケーション パイプラインの先頭または末尾に追加されます。

IStartupFilter でミドルウェアを登録する方法を次の例に示します。 RequestSetOptionsMiddleware ミドルウェアによって、クエリ文字列パラメーターからオプション値が設定されます。

public class RequestSetOptionsMiddleware
{
    private readonly RequestDelegate _next;

    public RequestSetOptionsMiddleware( RequestDelegate next )
    {
        _next = next;
    }

    // Test with https://localhost:5001/Privacy/?option=Hello
    public async Task Invoke(HttpContext httpContext)
    {
        var option = httpContext.Request.Query["option"];

        if (!string.IsNullOrWhiteSpace(option))
        {
            httpContext.Items["option"] = WebUtility.HtmlEncode(option);
        }

        await _next(httpContext);
    }
}

RequestSetOptionsMiddlewareRequestSetOptionsStartupFilter クラスで構成されています。

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

IStartupFilterConfigureServices のサービス コンテナーに登録されています。

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
           .ConfigureAppConfiguration((hostingContext, config) =>
           {
           })
         .ConfigureWebHostDefaults(webBuilder =>
         {
             webBuilder.UseStartup<Startup>();
         })
        .ConfigureServices(services =>
        {
            services.AddTransient<IStartupFilter,
                      RequestSetOptionsStartupFilter>();
        });
}

option のクエリ文字列パラメーターを指定すると、ミドルウェアでは ASP.NET Core ミドルウェアによって応答がレンダリングされる前に値の割り当てを処理します。

ミドルウェアの実行順序は、IStartupFilter の登録順に設定されています。

  • 複数の IStartupFilter の実装が、同じオブジェクトとやり取りする可能性があります。 順序が重要な場合は、ミドルウェアの実行順序に合わせて IStartupFilter サービスの登録順序を指定してください。

  • IStartupFilter に登録された他のアプリケーション ミドルウェアの前または後に実行される IStartupFilter の実装が 1 つまたは複数あるミドルウェアを、ライブラリで追加することができます。 ライブラリの IStartupFilter よって追加されたミドルウェアの前に IStartupFilter ミドルウェアを呼び出すには、次のようにします。

    • サービス コンテナーにライブラリを追加する前に、サービス登録を配置する
    • 後で呼び出すために、ライブラリが追加された後にサービス登録を配置する

外部アセンブリからの起動時に構成を追加する

IHostingStartup の実装により、アプリの Startup クラスの外部にある外部アセンブリから、起動時に拡張機能をアプリに追加できるようになります。 詳細については、「ASP.NET Core でホスティング スタートアップ アセンブリを使用する」を参照してください。

その他の技術情報