ASP.NET Core でのアプリケーションのスタートアップ
注意
これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
警告
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
重要
この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
作成者: Rick Anderson
Web テンプレートを使用して作成した ASP.NET Core アプリでは、Program.cs
ファイルにアプリケーション スタートアップ コードが入っています。
この記事のガイダンスに追加されるまたは優先する Blazor 起動のガイダンスについては、「ASP.NET Core Blazor の起動」をご覧ください。
以下をサポートするアプリ スタートアップ コードを示します。
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.Hosting の ServerReady
イベントは、サーバーが要求に応答する準備ができているポイントを表します。
アプリケーションの起動の詳細については、「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);
}
}
RequestSetOptionsMiddleware
は RequestSetOptionsStartupFilter
クラスで構成されています。
namespace WebStartup.Middleware;
// <snippet1>
public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}
// </snippet1>
IStartupFilter
は Program.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);
}
}
RequestSetOptionsMiddleware
は RequestSetOptionsStartupFilter
クラスで構成されています。
namespace WebStartup.Middleware;
// <snippet1>
public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}
// </snippet1>
IStartupFilter
は Program.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 メソッドを含めます。
ConfigureServices
と 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 バージョンは似ています。
アプリの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 インスタンスに追加することで構成されます。 IApplicationBuilder
は Configure
メソッドから使用できますが、サービス コンテナーに登録されていません。 ホスティングによって IApplicationBuilder
が作成され、Configure
に直接渡されます。
ASP.NET Core テンプレートでは、次をサポートするパイプラインが構成されます。
- 開発者例外ページ
- 例外ハンドラー
- HTTP Strict Transport Security (HSTS)
- HTTPS リダイレクト
- 静的ファイル
- ASP.NET Core MVC と Razor ページ
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を構成します。
要求パイプライン内の各ミドルウェア コンポーネントは、パイプラインの次のコンポーネントを呼び出すか、妥当な場合はチェーンをショートさせます。
IWebHostEnvironment
、ILoggerFactory
、または ConfigureServices
で定義された任意のものなどの追加サービスを Configure
メソッド シグネチャで指定できます。 使用可能な場合、これらのサービスが挿入されます。
IApplicationBuilder
の使用方法およびミドルウェアの処理の順序については、「IApplicationBuilder
」を参照してください。
スタートアップを使用せずにサービスを構成する
Startup
クラスを使用せず、サービスと要求処理パイプラインを構成するには、ホスト ビルダーで便利なメソッド、ConfigureServices
と Configure
を呼び出します。 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);
}
}
RequestSetOptionsMiddleware
は RequestSetOptionsStartupFilter
クラスで構成されています。
public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}
IStartupFilter
は ConfigureServices のサービス コンテナーに登録されています。
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 でホスティング スタートアップ アセンブリを使用する」を参照してください。
その他の技術情報
ASP.NET Core