概要
Visual Studio 2022のWebアプリケーションのテンプレートについて調べてみました。
目次
- 「ASP.NET Core Webアプリ (Model-View-Controller)」テンプレート
- 「ASP.NET Core Webアプリ」テンプレート
- 「ASP.NET Core Web API」テンプレート
- 「Blazor Server アプリ」テンプレート
- 「Blazor WebAssembly アプリ」テンプレート
- 「ASP.NET Core Empty」テンプレート
「ASP.NET Core Webアプリ (Model-View-Controller)」テンプレート
2009年に初版がリリースされたASP.NET MVCが元になっているテンプレートです。
MVC(Model–View–Controller)パターンを採用しており、コントローラ・モデル・ビューを明確に分離した設計となっています。ビューを持つ Web アプリケーションに適しており、API の実装も可能です。ルーティングはコントローラベースで構成されます。
構造的には、
- Models(データ・ビジネスロジック)
- Views(表示)
- Controllers(要求を受ける)
となっており、責務を厳密に分離しているため、プロジェクトの規模が大きくなったり、構造が複雑化したりする場合でも、MVC の「責務分離」が大きな強みとなります。
MVCのルーティング方法は、例えると「受付(コントローラ)に行って、担当窓口(アクション)に振り分ける」イメージです。URL は /{controller}/{action}/{id?} といったルール(ルート)でコントローラ/アクションに結びつきます。ビュー(.cshtml)はアクションが返すテンプレートになります。
大規模なアプリケーションや複雑な UI に向いており、REST API1や複数ビューを扱いやすいです。また、ルーティングが複雑な場合(/orders/2025/12/25/region/JP/status/approved?page=3など)、一つ下の「ASP.NET Core Webアプリ」テンプレートよりもこちらのテンプレートが向いています。
「ASP.NET Core Webアプリ」テンプレート
2017年に初版がリリースされたテンプレートです。
Razor Pages(レイザーページズ)を使う構成がデフォルトで、ページ単位で完結するシンプルな構造です。Controllerは通常は不要で、基本的にPage-Modelの構成です。イメージ的には「Web版のForms」 のような感じかもしれません。
(「ASP.NET Core Webアプリ」)のルーティングは、例えると「ファイルの場所がそのまま住所」になります。/Pages フォルダの .cshtml に先頭行 @page があると、そのファイル自身がエンドポイント(入口)になります。なので、プロジェクト内のフォルダの場所がPages/Products/Index.cshtmlなら通常 https://example.com/Productsでアクセスできる、という感覚です。
CRUDやフォーム中心のアプリに最適です。また、MVCに比べると学習コストも低いので、初心者の小規模アプリ開発にも向いています。
「ASP.NET Core Webアプリ」テンプレートと「ASP.NET Core Webアプリ (Model-View-Controller)」テンプレートは、どちらも ASP.NET CoreのMVC基盤の上で動いています。Razor Pages は ASP.NET Core MVC の上で動くページ中心モデルのイメージです。なので基本的に、機能面で「MVCでしか作れない/Razor Pagesでしか作れない」という絶対的な制約はありません。
また、1つのアプリに Razor Pages と MVC を併用もできます。テンプレートは初期設定とフォルダ構成が違うだけなので、サービス登録とエンドポイントを足せば両方使えるイメージです。
加えて、例えば「ASP.NET Core Webアプリ」テンプレートサービス登録とエンドポイントの入れ替えに加えて、フォルダ構成・ファイルの役割・コードを「MVC 流儀」に移すことで、実行時の挙動は 「ASP.NET Core Webアプリ (Model-View-Controller)」テンプレート相当にできます。(逆も同様)
「ASP.NET Core Web API」テンプレート
Web APIを作るためのテンプレートで、画面(UI)を持ちません。
ブラウザやモバイルアプリ、SPA(React/Blazor など)、他サービスからの「HTTPリクエストで値(パラメータやJSON)を受けて、HTTPレスポンスで値(JSONなど)を返す」バックエンドの仕組みを作成できます。
REST APIやバックエンドサービスを構築するためのテンプレートで、Razor PagesやMVCのビューは含まれません。
この「ASP.NET Core Web API」テンプレートも、ASP.NET Core MVC の基盤上に乗っています。
「Blazor Server アプリ」テンプレート
.NET Core 3.0(2019年9月)で正式サポートされたテンプレートです。Blazorはブレイザーと読みます。
C#だけでUIを構築できるWebアプリです。サーバー側でUIをレンダリングし、SignalR2を内部で常時使用して、ブラウザと細かいUI更新のやり取りをしています。
ブラウザには差分(どこが変わったか)だけをリアルタイム通信で送り、ブラウザが最終的にHTMLとして表示します。ページ全体の再読み込み(F5)なしで UI が更新されます。MVC/Razor Pagesも「サーバーが計算して HTML を返す」のが通常ですが、Blazor Serverはそれに加えて「サーバーが計算して差分を即時反映」(F5なし)されます。
チャット/ダッシュボード/共同編集のように即時更新が嬉しい場面では使いますが、一般的な「フォーム送信+一覧更新」だけなら普通のAPI呼び出しでも十分です。
「Blazor WebAssembly アプリ」テンプレート
2020年5月19日 に Blazor WebAssembly 3.2.0 としてリリースされたテンプレートです。
(バージョンが3.2なのは、.NET Core 3.1 を基盤にしているが、また.NET Core 3.1と明確に区別するためです。Blazor WebAssembly は 3.1 の上に載ってはいるものの、3.1のLTSを継承しない扱いだったため、混同されないように専用の番号(3.2系)を付けています)
Blazor WebAssembly は「Blazor Server のUIレンダリングをブラウザで実行するバージョン」のようなイメージです。UI処理はブラウザで完結するので、サーバーの負荷は軽くなります。SignalRは使っていませんが、あとから任意で追加はできます。
初回アクセス時に、WASM(WebAssemblyの略)の .NETランタイム/アプリのDLL/静的資産をダウンロード&キャッシュします。以降はService Workerがキャッシュを使用してそれらを供給するため、オフラインでも起動・UI操作が可能です。
なので、オフライン対応のWebアプリに向いています。
「ASP.NET Core Empty」テンプレート
完全にカスタム構成で始めたい場合に使用します。最小限の設定のみの構成になっていますが、あとからMVCやRazor Pagesなども追加可能です。