ASP.NET Core の動作のしくみ

完了

基本的に、ASP.NET Core アプリは、必要な Web アプリ コンポーネント機能を設定してアプリを実行する Program.cs ファイルを持つ .NET アプリです。

最も基本的な ASP.NET Core アプリの Program.cs ファイル:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

前のコードを使用します。

  • 基本的な ASP.NET Core Web アプリケーションは、ルート URL ("/") で HTTP GET 要求をリッスンし、"Hello World!" で応答する設定です。
  • このアプリは、初期化されると、1 つのルートを構成し、Web サーバーを起動します。

Blazor

ASP.NET Core では Blazor を使用して対話型 Web UI を構築できます。 Blazor は、ASP.NET Core と統合されたコンポーネントベースの Web UI フレームワークであり、HTML、CSS、C# を使用して対話型 Web UI を構築するために使用されます。

Counter コンポーネントなどの再利用可能な Blazor コンポーネントは、以下のように Counter.razor ファイル内で定義されます。

@page "/counter"
@rendermode InteractiveServer

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

前のコードを使用します。

  • カウンターを表示するコンポーネントが作成されます。
  • @code ブロックには、カウンターをインクリメントするメソッドなど、C# を使用するコンポーネントのロジックが含まれています。
  • カウンター値は、ボタンがクリックされるたびに表示および更新されます。
  • コンポーネント アプローチは、アプリケーションのさまざまな部分でのコードの再利用を可能にし、Blazor アプリのブラウザー内とサーバー上の両方での実行が可能という柔軟性を持ちます。

Counter 要素を追加することで、<Counter /> コンポーネントをアプリ内の任意の Web ページに追加できます。

@page "/"

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

<Counter />

API

ASP.NET Core は、API、gRPC サービス、および SignalR を使用してクライアントに継続的にデータ更新をプッシュするリアルタイム アプリを構築するためのフレームワークを提供します。

基本的な最小限の API:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/hello", () => "Hello, World!");

app.Run();

前のコードを使用します。

  • /hello URL で HTTP GET 要求をリッスンし、"Hello, World!" で応答する最小限の API が設定されています。
  • WebApplicationBuilder は、アプリの構成に使用されます。
  • MapGet メソッドは、GET 要求のルートとハンドラーを定義します。

ミドルウェア

ASP.NET Core では、ミドルウェア コンポーネントのパイプラインを使用して HTTP 要求と応答を処理します。 このモジュール型のアプローチは柔軟性が高く、必要に応じてミドルウェア コンポーネントを追加または削除することで、アプリケーションの機能をカスタマイズして拡張することを可能にします。

ミドルウェア パイプラインは、HTTP 要求をシーケンシャルに処理し、各コンポーネントが指定されたタスクを実行してから、パイプライン内の次のコンポーネントに要求を渡すことを可能にします。

Program.cs ファイルへの組み込みミドルウェアの追加:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseHttpsRedirection();

app.UseRouting();

app.MapStaticAssets();

app.UseAuthentication();

app.UseAuthorization();

app.MapGet("/", () => "Hello World!");

app.Run();

上記のコードでは、以下のようないくつかの一般的なミドルウェアが追加されました。

  • UseHttpsRedirection:HTTP 要求を HTTPS にリダイレクトします。
  • UseRouting:要求をエンドポイントにマップするルーティングを有効にします。
  • MapStaticAssets:HTML、CSS、JavaScript、画像、その他のアセットなどの静的ファイルの配信を最適化します。
  • UseAuthentication:認証機能を追加します。
  • UseAuthorization:認可機能を追加します。
  • app.MapGet:これは、アプリケーションが実行されていることを示すシンプルなエンドポイントです。

依存関係の挿入

ASP.NET Core には、アプリとそのさまざまなフレームワーク コンポーネントで使用されるサービスを構成するための依存関係の注入 (DI) のサポートが組み込まれています。

たとえば、EntityFramework Core などのフレームワークを使用して、アプリのその他の部分がデータベースにアクセスするために利用するサービスを一元的に構成したい場合が考えられます。 次のような依存関係の注入を使用して、EntityFramework Core からのデータベース コンテキストをサービスとして構成することができます。

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
    
    public DbSet<Product> Products { get; set; } = default!;
}

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

var app = builder.Build();

app.Run();

前のコードを使用します。

  • DbContext は、依存関係の注入を使用するサービスとして構成されます。
  • WebApplicationBuilder は、アプリの構成に使用されます。
  • AddDbContext メソッドは、依存関係注入コンテナーに DbContext を登録します。
  • 接続文字列はこの構成から取得され、データベース コンテキストを設定するために使用されます。

構成

ASP.NET Core は、JSON ファイル、環境変数、コマンド ライン引数など、さまざまなソースからの構成データへのアクセスをサポートしています。

appsetting.json ファイル内での接続文字列の構成:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;"
  }
}

Program.cs ファイル内:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

var app = builder.Build();

app.Run();

前のコードを使用します。

  • 接続文字列は、appsettings.json ファイル内で構成されます。
  • WebApplicationBuilder は、アプリの構成に使用されます。
  • AddDbContext メソッドは、依存関係注入コンテナーに DbContext を登録します。
  • 接続文字列はこの構成から取得され、データベース コンテキストを設定するために使用されます。

監視と診断

ASP.NET Core には、アプリケーションの正常性とパフォーマンスを監視して維持するための包括的なツール スイートが用意されています。 これらの機能をミドルウェア コンポーネントとしてアプリケーションに簡単に追加することで、特定の機能をプロジェクトに統合できます。

  • 組み込みのメトリック:ASP.NET Core には、要求レート、応答時間、エラー率など、アプリケーションのパフォーマンスのさまざまな側面を追跡する組み込みのメトリックが用意されています。
  • 柔軟なログ記録フレームワーク:柔軟なログ記録フレームワークが組み込まれており、コンソール、デバッグ、イベント ソースなど、さまざまなログ プロバイダーをサポートしています。 これは、診断と監視のために詳細なログをキャプチャするのに役立ちます。
  • トレース:ASP.NET Core は、分散トレースをサポートしており、これはさまざまなサービスとコンポーネントにわたって要求のフローを追跡するのに役立ちます。 これは、パフォーマンスの問題を診断し、アプリケーションのさまざまな要素間のやり取りを理解するのに役立ちます。
  • OpenTelemetry:ASP.NET Core は、クラウドネイティブ ソフトウェア用のオープンソースの監視フレームワークである OpenTelemetry と統合されています。 OpenTelemetry は、メトリック、ログ、トレースを収集するための標準化された API とインストルメンテーションを提供し、アプリケーションをより効果的に監視して診断することを可能にします。
  • 正常性チェック:正常性チェック API を使用すると、アプリケーションとその依存関係の正常性を監視できます。 データベース、外部サービスなど、さまざまなコンポーネントの状態を報告するように正常性チェックを構成することができます。
  • 診断ツール:ASP.NET Core は、dotnet-trace、dotnet-dump、dotnet-gcdump など、さまざまな診断ツールを提供しており、これらはアプリケーションから診断データを収集して分析するのに役立ちます。