概要
この記事は、.net Core 6.0 (.net6.0) で用いるProgram.csについて、調べた結果です。
そのため、この記事を読むと、
- Program.csは何をしているのか
- 時々でてくるパイプラインやミドルウェアってなんなのか
がある程度スッキリとします。
特に、.net6.0 初心者の方にお勧めです。
(なぜなら、僕も初心者だからです。)
背景
.net Core 6.0 (.net6.0) を用いてウェブアプリケーションを作成していた際、「よく分かってないけど、とりあえずあとでいいや」というものがたくさんあります。(.net 6.0に限った話ではないけれども)
Program.csはその一つで、きっとアプリの立ち上げの際に色々頑張ってくれてるんだけど、何やってるかはよくわかりませんでした。しかし、テストデータ作成のときだったかに(よく覚えていない)、サンプルでProgram.csを変更しており、「Program.cs触るの嫌だなぁ」と思ったのを覚えています。
ということで、Program.cs についてまとめました。
Program.csって何?
おなじみのMicrosoftの公式ドキュメントを漁ってみました。
Webテンプレートを用いてASP.NET Coreのアプリを作成すると、Program.cs中にアプリケーションを起動するコードが含まれています。Program.csとは、
Microsoft 公式ドキュメント “ASP.NET Core fundamentals overview” 拙訳
- アプリに必要なサービスを設定している。
- 一連のミドルウェアの部品によって、アプリのリクエストを処理するパイプラインが定義されている。
ミドルウェア と パイプラインというよくわからない用語が出てきました。
一旦これらについて調べていきます。
ミドルウェアとパイプラインって何?
ミドルウェアとパイプラインの関係性を示した図がこちらになります。
TEKTUTORIALSHUB “Middleware And Request Pipeline in ASP.NET Core”
先に、パイプライン (Pipeline)、ミドルウェア(Middleware) 以外について簡単に説明しちゃいます。
※このあたりは感覚的な認識のため、違ったら教えてください
- Request, Response
-
Requestは、Http Request のことで、クライアントからデータサーバーへの
何らかの要求 を意味します。一方、Response は、Requestに対する応答になります。
- Kestrel
-
Kestrel web サーバーはリクエストを取得し、そして、httpContext を作成し、
TEKTUTORIALSHUB “Middleware And Request Pipeline in ASP.NET Core” 拙訳
リクエストパイプライン中の1つ目のミドルウェアに渡す。
パイプライン (Pipeline)
リクエストパイプラインは、クライアントからのアクセスが
リクエストから始まり、レスポンスで終わる構造のことです。パイプラインはアプリケーションがHTTP requestに対して
どのように応答するかを明確に示します。また、ブラウザーから送られてきたリクエストはパイプラインを通過し、
TEKTUTORIALSHUB “Middleware And Request Pipeline in ASP.NET Core” 拙訳
また、パイプラインを戻っていきます。
とのことでして、クライアントからの要求がパイプラインを通り、そして、パイプラインを通って応答も渡されるみたいです。(… 恐らく)
ミドルウェア (Middleware)
TEKTUTORIALSHUB “Middleware And Request Pipeline in ASP.NET Core” 拙訳
- ソフトウェアの部品で、パイプラインに繋がっている。
- それぞれのミドルウェアは、前のミドルウェアから受け取ったリクエストを
処理・操作する。- それぞれのミドルウェアで、次のミドルウェアを呼び出すか、
パイプラインを終了させるかを決定する。
ということで、ミドルウェアは、パイプラインに繋がっており、
それぞれのミドルウェアで処理を行い、次のミドルウェアを呼び出す、みたいです。
また、Microsoftの公式ドキュメントによると、
慣例的に、ミドルウェアの部品はUse{Feature} メソッドによって、呼び出されます。
Microsoft公式ドキュメント ASP.NET Core fundamentals overview 拙訳
みたいです。
パイプラインとミドルウェアの定義を踏まえて、先ほどのProgram.csの定義を見てみると、
Webテンプレートを用いてASP.NET Coreのアプリを作成すると、Program.cs中にアプリケーションを起動するコードが含まれています。Program.csとは、
Microsoft 公式ドキュメント “ASP.NET Core fundamentals overview” 拙訳
- アプリに必要なサービスを設定している。
- 一連のミドルウェアの部品によって、アプリのリクエストを処理するパイプラインが定義されている。
Program.csの役割、パイプライン・ミドルウェアとの関係性、が見えてくるかと思います。
まとめ
今回のまとめです。
最後まで読んでいただき、ありがとうございました。
- Program.csはアプリケーションに必要なサービスを設定している。
- Program.csには、一連のミドルウェアによって構成されたパイプラインが定義されている。
- それぞれのミドルウェアは、前のミドルウェアからリクエストを受け取り、処理・操作を行い、次のミドルウェアの呼び出し もしくは パイプラインを終了させる。
おまけ:公式ドキュメント読みながら流れを追ってみた
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
//Add DbContext
builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Wob")));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
上記のソースコードは、実際に僕が.net 6.0を用いてWebアプリケーションを開発した(途中の)際の、
Program.csになります。これについて、詳細にざっくりと見ていきます。
以下、ソースコード → 公式ドキュメント の流れになります。
var builder = WebApplication.CreateBuilder(args);
あらかじめ用意された設定を用いて、WebApplicationBuilder クラスのインスタンスを新たに初期化する。
Microsoft 公式ドキュメント WebApplication.CreateBuilder Method 拙訳
// Add services to the container.
builder.Services.AddControllersWithViews();
//Add DbContext
builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Wob")));
このあたりは、MVCのコントローラーの追加やDbContextの追加 (appsettings.jsonに記載したConnectionStringを指定) を意味しています。
Microsoft公式ドキュメント MvcServiceCollectionExtensions.AddControllersWithViews Method を参考
Microsoft公式ドキュメント EntityFrameworkServiceCollectionExtensions.AddDbContext Method を参考
var app = builder.Build();
WebApplicationをビルドします。
Microsoft公式ドキュメント WebApplicationBuilder.Build Method 拙訳
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
ちょっと調べましたが、よくわかりませんでした。Hostの環境名を調べるみたいですが、そもそも環境名ってなんだって感じで、また、条件文以降のものもよく分かりませんでした。
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
Microsoft公式ドキュメント HttpsPolicyBuilderExtensions.UseHttpsRedirection(IApplicationBuilder) Method を参考
- HTTPSに対するHttp Requestのリダイレクトを行うミドルウェアを追加します。
- 現在のリクエストパスに対して、static fileの受け取りを可能にします。
- Microsoft.AspNetCore.Routingを追加します。
- 権限付与を可能にするMicrosoft.AspNetCore.Authorization.AuthorizationMiddlewareを追加します。
Microsoft公式ドキュメントStaticFileExtensions.UseStaticFiles Method を参考
Microsoft公式ドキュメント EndpointRoutingApplicationBuilderExtensions.UseRouting Method を参考
Microsoft公式ドキュメント AuthorizationAppBuilderExtensions.UseAuthorization Method を参考
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
最後に、これはよく分かりませんでした。予想ですが、デフォルトのURLを指定し、アプリケーションを起動させたのだと考えています。
コメント