演習 - Web アプリをローカルで実行する
この演習では、次のことを行います。
- Web アプリをローカルで実行し、ブラウザーでそれを表示します。
- Web アプリの提供方法を確認します。
Web アプリを実行してブラウザーで表示する
以下のようにして、Visual Studio Code で Web アプリを実行し、ブラウザーで表示します。
Visual Studio Code で、F5 キーを押してアプリを実行します。
Visual Studio Code:
- アプリケーションをビルドして実行する .NET CLI コマンドの
dotnet run
をトリガーします。 - 実行中のアプリケーションにデバッガーをアタッチします。
Visual Studio Code でプロジェクトを初めて実行すると、[デバッガーの選択] プロンプトが表示されます。
- アプリケーションをビルドして実行する .NET CLI コマンドの
Visual Studio Code UI の上部にあるコマンド パレット内の [デバッガーの選択] プロンプトで、[C#] を選択します。 次のプロンプトで、既定の起動構成 (
C#: MyWebApp [Default Configuration]
) を選択します。既定のブラウザーが
http://localhost:{PORT}
で起動され、アプリの応答が表示されます。 プレースホルダー{PORT}
は、アプリのプロジェクトの作成時に割り当てられたランダムなポートです。 ローカル ポートとの競合が原因でポートを変更する必要がある場合は、プロジェクトの Properties/launchSettings.json ファイル内でポートを変更します。ブラウザーに表示される応答:
ブラウザー ウィンドウを閉じます。
Visual Studio で、以下のいずれかを実行します。
- [実行] メニューから [デバッグの停止] を選択します。
- キーボードの Shift+F5 キーを押します。
以下のように .NET CLI を使用して Web アプリを実行します。
ターミナルまたはコマンド ラインから、MyWebApp.csproj ファイルを含む MyWebApp プロジェクト ディレクトリに移動します。
次のコマンドを使用してアプリをビルドして実行します。
dotnet run
プロジェクトがビルドおよび実行され、コマンド ラインに次の出力が表示されます。
C:\MyWebApp> dotnet run Building... info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5267 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down.
指定された URL のポート番号はプロジェクトの作成時に構成でランダムに設定されるため、エンドポイントのポート番号が異なる場合があります。
自身のコマンド ライン出力で生成された URL でブラウザーを開くと、以下のようにアプリの応答
Hello World!
が表示されます。アプリをシャットダウンするには、コマンド ラインで Ctrl キーを押しながら C キーを押します。
Web アプリの提供方法
アプリのビルドと実行の際には、以下の処理が行われます。
ビルドと構成:
- 依存関係を復元し、プロジェクトをコンパイルするために MSBuild が呼び出されます。 MSBuild は、MyWebApp.csproj プロジェクト ファイルを処理し、ソース コードをアセンブリにコンパイルします。
- アプリは、既定の起動プロファイル (最初に一覧表示されたもの) のlaunchSettings.json で指定された設定を含む構成設定を読み取ります。
ホストのセットアップ:
-
WebApplication.CreateBuilder
内の メソッドが Web ホストを設定します。 既定では、このメソッドは Kestrel を Web サーバーとして構成します。 Kestrel は、高パフォーマンス用に設計された ASP.NET Core 用のクロスプラットフォーム Web サーバーです。 - Kestrel は、構成された URL での受信 HTTP (指定がある場合は HTTPS を含む) 要求のリッスンを開始します。
要求の処理:
- 要求を受信すると、Kestrel はそれを ASP.NET Core ミドルウェア パイプラインに転送します。
- ミドルウェア パイプラインは、認証、ログ、ルーティングなどのタスクを処理できる一連のミドルウェア コンポーネントを介して要求を処理します。
- 要求が定義済みのルートにマッチする場合は、対応するエンドポイントが実行されます。 このケースでは、
app.MapGet("/", () => "Hello World!")
エンドポイントがルート URL への要求を処理し、文字列Hello World!
を返します。
応答:
- 応答 (このケースでは文字列 "Hello World!") がミドルウェア パイプラインを介して Kestrel に送り返された後、クライアントに送り返されます。