ASP.NET Core
汎用ホスト概要
株式会社SAKURUG
エンジニアリングユニット
草場 友光
.NET ラボ 2022年10月
自己紹介
• 普段は主にWebFormsアプリの保守の
お仕事をしてます。
• 古めのシステムが多いので時代に取り
残されぬよう新しい技術を一つでも入
れるよう日々努力しています。
• 2022/08-2023 Microsoft MVP
(Developer Technologies)
• tomo_kusaba
宣伝
【VISION】ひとの可能性を開花させる企業であり続ける
VISIONに共感できる仲間募集中。
注意
• 個人の見解・解釈が多分に入っています。
• 見解の相違・事実誤認などありましたらご指摘ください。
• #dotnetlabでtweetすると右側に表示されます
今日の目的
• ASP.NET Coreにおける汎用ホスト(Generic Host)の意義につ
いてを知る
• また、.NET全体から見た汎用ホストの位置づけを確認する
• 汎用ホストのもつ主な機能について確認をする
汎用ホストの意義について
• .NETにおけるアプリケーションの共通的な作りを統一化する
• どのアプリケーションでも必要とされるようなベースラインの
機能を提供する
• 開発者は必要とする任意の機能をホストに追加することができ
る
汎用ホストがない世界線・・・
• アプリケーションごとに異なる実装(ログ・DI・構成)
• ミドルウェア実装が汎用ホストに紐付いてないためワークロー
ドごとに書きっぷりが変わっていた可能性
• とにかく、WebでもコンソールでもWPFでもMAUIでも記述に
統一性を持たせてくれたのが汎用ホストの恩恵
ASP.NET Coreの汎用ホストの種類
• .NET WebApplicationホスト(最小ホスト)
• .NETでの汎用ホスト
• ASP.NET CoreのWebホスト
.NET WebApplicationホスト
• コード例
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
.NETでの汎用ホスト
• コード例
using Microsoft.AspNetCore.Hosting;
await Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Configure ((ctx, app) =>
{
app.UseRouting();
app.UseEndpoints(e =>
{
e.MapGet("/", () => "Hello World!");
});
});
})
.Build()
.RunAsync();
汎用ホストの機能について再確認
• 依存関係の挿入(DI)
• ログの記録
• 構成
既定のBuilder設定
(CreateDefaultBuilder)
• コンテンツ ルートを、GetCurrentDirectory によって返されるパスに設定します。
• 次からホスト構成を読み込みます。
• プレフィックス DOTNET_ が付いた環境変数。
• コマンド ライン引数。
• 次からアプリの構成を読み込みます。
• appsettings.json.
• appsettings.{Environment}.json.
• 環境でアプリが実行される場合に使用されるユーザー シークレット。
• 環境変数。
• コマンド ライン引数。
• 次のログ プロバイダーを追加します。
• コンソール
• デバッグ
• EventSource
• イベント ログ (Windows で実行されている場合のみ)
• 環境が [開発] になっている場合は、スコープの検証と依存関係の検証を有効にします。
既定のBuilder設定
(ConfigureWebHostDefaults)
• プレフィックス ASPNETCORE_ が付いた環境変数からホスト構成
を読み込みます。
• Kestrel サーバーを Web サーバーとして設定し、アプリのホスティ
ング構成プロバイダーを使用してそれを構成します。 Kestrel サー
バーの既定のオプションについては、「Kestrel」を参照してくださ
い。
• Host Filtering middleware を追加します。
• が true の場合、Forwarded Headers Middleware を追加します。
• IIS 統合を有効にします。 IIS の既定のオプションについては、
「IIS を使用した Windows での ASP.NET Core のホスト」を参照
してください。
依存関係の挿入(DI)
• 汎用ホストの機能によってDIの機能が提供されています。
• DIについての詳しい解説は省略します
• (これで一つのセッションになってしまいます)
ASP.NET Coreのミドルウェア例
ミドルウェア 説明 API
認証 認証のサポートを有効にします。 UseAuthenctication
承認 承認のサポートを有効にします。 UseAuthorization
CORS クロスオリジンリソース共有を有効にします。 UseCors
例外ハンドラ ミドルウェアパイプラインがスローする例外をグローバルに処理します。 UseExceptionHandler
転送されるヘッダ プロキシされたヘッダーを現在の要求に転送します。 UseForwardedHeaders
HTTPSリダイレクト すべてのHTTP要求をHTTPSにリダイレクトします。 UseHttpsRedirection
HSTS 特殊な応答ヘッダを追加するセキュリティ拡張のミドルウェア UseHsts
MVC MVCまたRazor Pagesで要求を処理します UseMvc
要求ログ HTTP要求と応答ログのサポートを提供します。 UseHttpLogging
W3Cログ W3C形式のHTTP要求と応答ログのサポートを提供します。 UseW3CLogging
応答キャッシュ 応答のキャッシュのサポートを提供します。 UseResponseCaching
応答圧縮 応答の圧縮のサポートを提供します。 UseResponseCompression
セッション ユーザセッションの管理のサポートを提供します。 UseSession
静的ファイル 静的ファイルとディレクトリ参照に対応するサポートを提供します。 UseStaticFiles, UseFileServer
WebSocket WebSocketプロトコルを有効にします。 UseWebSockets
ログの記録
既定の ASP.NET Core Web アプリ
テンプレートでは
• 汎用ホストが使用されます。
• WebApplication.CreateBuilder
が呼び出されます。これにより、次
のログ プロバイダーが追加されま
す。
• コンソール
• デバッグ
• EventSource
• EventLog:Windows のみ
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
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();
HTTPログ
HTTP ログは、受信した HTTP 要求と
HTTP 応答に関する情報をログに記録するミ
ドルウェアです。 HTTP ログにより、次の
ログが提供されます。
• HTTP 要求情報
• 共通プロパティ
• ヘッダー
• 本文
• HTTP 応答情報
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseHttpLogging();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.MapGet("/", () => "Hello World!");
app.Run();
W3Cログ
W3CLogger は W3C 標準形式で
ログ ファイルを書き込むミドル
ウェアです。 ログには、HTTP 要
求と HTTP 応答に関する情報が含
まれています。 W3CLogger は次
のログを提供します。
• HTTP 要求情報
• 共通プロパティ
• ヘッダー
• HTTP 応答情報
• 要求/応答のペアに関するメタ
データ (開始日時、所要時間)
var app = builder.Build();
app.UseW3CLogging();
app.UseRouting();
ルーティング
• 受信したHTTP要求を照合し、それらをアプリの実体にディス
パッチすること。
• 次のものを利用してルーティングを構成できる
• Controllers
• Razor Pages
• SignalR
• gRPC
• エンドポイント対応のミドルウェア
• ルーティング対応のデリゲートとラムダ
ルーティング例 (Hello World)
左の例ではMapGetメソッドを使用するエ
ンドポイントが1つ含まれます。
• HTTP GET要求がルートURL「/」に送
信された場合
• 要求デリゲートが実行されます
• Hello World!がHTTP応答に書き込まれます
• 要求メソッドがGETでない場合、また
ルートURLが「/」でない場合は一致す
るルートはなくHTTP404が返されます。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
ホストの構成
次の変数は、ホスト ビルダーを初期化するときに早期にロックされ、
アプリケーション構成の影響を受けることはありません。
• アプリケーション名
• 環境名 (例: Development、Production、Staging)
• コンテンツ ルート
• Web ルート
• スタートアップ アセンブリのホスティングをスキャンするかどうか、
およびスキャンするアセンブリ。
• IHostBuilder.ConfigureAppConfiguration コールバックの
HostBuilderContext.Configuration からアプリおよびライブラリ
コードによって読み取られる変数。
アプリの構成の優先順位
1. コマンドライン構成プロバイダーを使用するコマンドライン引数。
2. 接頭辞なしの環境変数構成プロバイダーを使用した接頭辞なしの
環境変数。
3. 環境でアプリが実行される場合に使用されるユーザー シークレッ
ト。
4. JSON 構成プロバイダーを使用する
appsettings.{Environment}.json。 たとえば、
appsettings.Production.json と
appsettings.Development.json です。
5. JSON 構成プロバイダーを使用する appsettings.json。
6. 次のセクションで説明するホスト構成へのフォールバック。
デモ
• コンソールテンプレートからブラウザにHello Worldを表示す
るまで。
参考文献
• ASP.NET Core の .NET 汎用ホスト
• ASP.NET Core の構成
• .NET Core および ASP.NET Core でのログ記録
• ASP.NET Core での HTTP ログ
• ASP.NET Core の W3CLogger
• ASP.NET Core のルーティング
• ASP.NET Core のミドルウェア
おしまい
おしまい

ASP. NET Core 汎用ホスト概要