次の方法で共有


ASP.NET Core の基礎の概要

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

警告

このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

この記事では、依存関係の挿入 (DI)、構成、ミドルウェアなど、ASP.NET Core アプリを構築するための基礎の概要について説明します。

この記事のガイダンスに追加または置き換わる Blazor の基礎ガイダンスについては、 ASP.NET Core Blazor の基礎を参照してください。

Program.cs

Web テンプレートを使用して作成した ASP.NET Core アプリでは、Program.cs ファイルにアプリケーション スタートアップ コードが入っています。 Program.cs ファイルは、次のような場所です。

次のアプリ スタートアップ コードでは、いくつかの種類のアプリがサポートされています。

using WebAll.Components;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

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

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.UseAntiforgery();

app.Run();

依存性の注入 (サービス)

ASP.NET Core には、構成済みのサービスをアプリ全体で使用できるようにする組み込みの 依存関係挿入 (DI) 機能があります。 サービスは WebApplicationBuilder.Services (前述のコードの builder.Services) を使用して DI コンテナーに追加されます。 WebApplicationBuilderがインスタンス化されると、フレームワークによって提供される多くのサービスが自動的に追加されます。 builder は、次のコードでは WebApplicationBuilder です。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

前のコードでは、 CreateBuilder は構成、ログ記録、 およびその他の多くのサービス を DI コンテナーに追加します。 DI フレームワークは、要求されたサービスのインスタンスを実行時に提供します。

次のコードでは、カスタム DbContext と Blazor コンポーネントを DI コンテナーに追加します。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextFactory<BlazorWebAppMoviesContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MoviesContext") 
        ?? throw new InvalidOperationException("Connection string not found.")));

builder.Services.AddQuickGridEntityFrameworkAdapter();

builder.Services.AddDatabaseDeveloperPageExceptionFilter();

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

var app = builder.Build();

Blazor Web Appでは、多くの場合、次の例に示すように、@inject コンポーネントで Razor ディレクティブを使用して、実行時に DI からサービスが解決されます。

@page "/movies"
@rendermode InteractiveServer
@using Microsoft.EntityFrameworkCore
@using Microsoft.AspNetCore.Components.QuickGrid
@using BlazorWebAppMovies.Models
@using BlazorWebAppMovies.Data
@implements IAsyncDisposable
@inject IDbContextFactory<BlazorWebAppMovies.Data.BlazorWebAppMoviesContext> DbFactory

<PageTitle>Index</PageTitle>

<h1>Index</h1>

<div>
    <input type="search" @bind="titleFilter" @bind:event="oninput" />
</div>

<p>
    <a href="movies/create">Create New</a>
</p>

<QuickGrid Class="table" Items="FilteredMovies" Pagination="pagination">
    <PropertyColumn Property="movie => movie.Title" Sortable="true" />
    <PropertyColumn Property="movie => movie.ReleaseDate" Title="Release Date" />
    <PropertyColumn Property="movie => movie.Genre" />
    <PropertyColumn Property="movie => movie.Price" />
    <PropertyColumn Property="movie => movie.Rating" />

    <TemplateColumn Context="movie">
        <a href="@($"movies/edit?id={movie.Id}")">Edit</a> |
        <a href="@($"movies/details?id={movie.Id}")">Details</a> |
        <a href="@($"movies/delete?id={movie.Id}")">Delete</a>
    </TemplateColumn>
</QuickGrid>

<Paginator State="pagination" />

@code {
    private BlazorWebAppMoviesContext context = default!;
    private PaginationState pagination = new PaginationState { ItemsPerPage = 10 };
    private string titleFilter = string.Empty;

    private IQueryable<Movie> FilteredMovies =>
        context.Movie.Where(m => m.Title!.Contains(titleFilter));

    protected override void OnInitialized()
    {
        context = DbFactory.CreateDbContext();
    }

    public async ValueTask DisposeAsync() => await context.DisposeAsync();
}

前のコードでは、次のようになります。

  • @inject ディレクティブが使用されます。
  • サービスは、 OnInitialized メソッドで解決され、 context 変数に割り当てられます。
  • context サービスによって、FilteredMovieリストが作成されます。

DI からサービスを解決するもう 1 つの方法は、コンストラクターの挿入を使用することです。 次の Razor Pages コードでは、コンストラクターの挿入を使用して、DI からデータベース コンテキストとロガーを解決します。

public class IndexModel : PageModel
{
    private readonly RazorPagesMovieContext _context;
    private readonly ILogger<IndexModel> _logger;

    public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
    {
        _context = context;
        _logger = logger;
    }

    public IList<Movie> Movie { get;set; }

    public async Task OnGetAsync()
    {
        _logger.LogInformation("IndexModel OnGetAsync.");
        Movie = await _context.Movie.ToListAsync();
    }
}

前のコードでは、 IndexModel コンストラクターは RazorPagesMovieContext 型のパラメーターを受け取ります。これは実行時に _context 変数に解決されます。 コンテキスト オブジェクトは、 OnGetAsync メソッドでムービーの一覧を作成するために使用されます。

詳細については、「Blazor と ASP.NET Core における依存性注入 を参照してください。

ミドルウェア

要求を処理するパイプラインは、一連のミドルウェア コンポーネントとして構成されています。 各コンポーネントによって、HttpContext に対して操作が実行され、パイプラインの次のミドルウェアが呼び出されるか、または要求が終了されます。

通常、ミドルウェア コンポーネントは、Use{Feature} 拡張メソッドを呼び出すことでパイプラインに追加されます。 Use{Feature}という名前のメソッドを使用してアプリにミドルウェアを追加する方法を次のコードに示します。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextFactory<BlazorWebAppMoviesContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MoviesContext") 
        ?? throw new InvalidOperationException("Connection string not found.")));

builder.Services.AddQuickGridEntityFrameworkAdapter();

builder.Services.AddDatabaseDeveloperPageExceptionFilter();

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    SeedData.Initialize(services);
}

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
    app.UseMigrationsEndPoint();
}
app.UseHttpsRedirection();

app.UseAntiforgery();

app.MapStaticAssets();
app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();

app.Run();

詳細については、「ASP.NET Core のミドルウェア」を参照してください。

ホスト

起動時に、ASP.NET Core アプリによってホストがビルドされます。 ホストにより、次のようなアプリのすべてのリソースがカプセル化されます。

  • HTTP サーバーの実装
  • ミドルウェア コンポーネント
  • ログ機能
  • 依存性の注入 (DI) サービス
  • 構成

ASP.NET Core アプリを実行できる次の 3 つの異なるホストがあります。

ASP.NET Core WebApplicationWebApplicationBuilder の種類が推奨され、すべての ASP.NET Core テンプレートで使用されます。 WebApplication は.NET 汎用ホストと同様に動作し、同じインターフェイスの多くを公開しますが、構成に必要なコールバックは少なくなります。 ASP.NET Core の WebHost は、下位互換性のためにのみ使用できます。

次の例では、 WebApplication をインスタンス化し、 appという名前の変数に割り当てます。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContextFactory<BlazorWebAppMoviesContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MoviesContext") 
        ?? throw new InvalidOperationException("Connection string not found.")));

builder.Services.AddQuickGridEntityFrameworkAdapter();

builder.Services.AddDatabaseDeveloperPageExceptionFilter();

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

var app = builder.Build();

WebApplicationBuilder.Build メソッドでは、次のような一連の既定のオプションを使用してホストを構成します。

  • Web サーバーとして Kestrel を使用し、IIS の統合を有効にします。
  • 構成を、appsettings.json、環境変数、コマンド ライン引数、およびその他の構成ソースから読み込みます。
  • ログ出力をコンソールとデバッグ プロバイダーに送ります。

Web 以外のシナリオ

汎用ホストを使用すると、ログ記録、依存関係の挿入 (DI)、構成、アプリの有効期間管理など、他の種類のアプリでクロスカット フレームワーク拡張機能を使用できます。 詳細については、「ASP.NET Core の .NET 汎用ホスト」および「ASP.NET Core でホステッド サービスを使用するバックグラウンド タスク」を参照してください。

サーバー

ASP.NET Core アプリは、HTTP 要求をリッスンするために HTTP サーバー実装を使用します。 サーバーは、 に構成したHttpContextのセットとして、アプリへの要求を公開します。

ASP.NET Core では、次のサーバー実装が提供されます。

  • Kestrel は、クロスプラットフォームの Web サーバーです。 Kestrel は IIS を使用してリバース プロキシ構成で実行されることがよくあります。 Kestrel は、ASP.NET Core 2.0 以降で、インターネットに直接公開される一般向けエッジ サーバーとして実行することもできます。
  • IIS HTTP サーバーは、IIS を使用する Windows のサーバーです。 このサーバーでは、ASP.NET Core アプリと IIS が同じプロセスで実行されます。
  • HTTP.sys は、IIS とは一緒に使用しない Windows のサーバーです。

詳細については、「ASP.NET Core での Web サーバーの実装」を参照してください。

構成

ASP.NET Core は、構成プロバイダーの順序付けされたセットから、名前と値のペアの設定を取得する構成フレームワークとなります。 組み込み構成プロバイダーは、.json ファイル、.xml ファイル、環境変数、コマンドライン引数などのさまざまなソースで使用できます。 他のソースをサポートするには、カスタム構成プロバイダーを作成します。

既定では、ASP.NET Core アプリは、appsettings.json、環境変数、コマンド ラインなどから読み取るように構成されます。 アプリの構成が読み込まれると、環境変数からの値によって appsettings.json からの値がオーバーライドされます。

開発環境でパスワードなどの機密構成データを管理するために、.NET Core には シークレット マネージャーが用意されています。 実稼働の機密情報には、Azure Key Vault を使用することをお勧めします。

詳細については、「ASP.NET Core の構成」を参照してください。

環境

DevelopmentStagingProduction などの実行環境は ASP.NET Core で使用できます。 アプリが実行している環境は、ASPNETCORE_ENVIRONMENT 環境変数を設定することにより指定します。 ASP.NET Core は、アプリの起動時にその環境変数を読み取り、その値を IWebHostEnvironment 実装に格納します。 この実装は、依存性の注入 (DI) を介して、アプリ内の任意の場所で使用できます。

次の例では、 環境で実行されて "いない" 場合に、例外ハンドラーと Development ミドルウェアを構成します。

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
    app.UseMigrationsEndPoint();
}

詳細については、「ASP.NET Core で複数の環境を使用する」を参照してください。

ログ機能

ASP.NET Core では、さまざまな組み込みのサードパーティ製のログ記録プロバイダーと連携するログ記録 API がサポートされています。 使用可能なプロバイダーは次のとおりです。

  • コンソール
  • デバッグ
  • Windows でのイベント トレース
  • Windows イベント ログ
  • TraceSource
  • Azure App Service
  • Azure Application Insights

ログを作成するには、依存性の挿入 (DI) から ILogger<TCategoryName> サービスを解決し、LogInformation などのログ メソッドを呼び出します。 次の例は、.razor内のページのBlazor Web App ファイルでロガーを取得して使用する方法を示しています。 CreateBuilder メソッドが Program.cs で呼び出されると、ロガー オブジェクトとそのコンソール プロバイダーが DI コンテナーに自動的に格納されます。

@page "/weather"
@attribute [StreamRendering]
@inject ILogger<Weather> Logger

<PageTitle>Weather</PageTitle>

<h1>Weather</h1>

<p>This component demonstrates showing data and logging.</p>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th aria-label="Temperature in Celsius">Temp. (C)</th>
                <th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}

@code {
    private WeatherForecast[]? forecasts;

    protected override async Task OnInitializedAsync()
    {
        // Simulate asynchronous loading to demonstrate streaming rendering
       
        await Task.Delay(500);

        Logger.LogInformation("This is an information log message.");
        Logger.LogWarning("This is a warning log message.");
        Logger.LogError("This is an error log message.");

        var startDate = DateOnly.FromDateTime(DateTime.Now);
        var summaries = new[] { "Freezing", "Bracing", "Chilly",
            "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
        forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = startDate.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = summaries[Random.Shared.Next(summaries.Length)]
        }).ToArray();
    }

    private class WeatherForecast
    {
        public DateOnly Date { get; set; }
        public int TemperatureC { get; set; }
        public string? Summary { get; set; }
        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    }
}

詳細については、「.NET Core と ASP.NET Core でのログ記録」を参照してください。

ルート指定

ASP.NET Core でのルーティングは、受信要求をアプリケーション内の特定のエンドポイントにマップするメカニズムです。 これにより、 Blazor コンポーネント、 Razor ページ、MVC コントローラー アクション、ミドルウェアなど、さまざまなコンポーネントに対応する URL パターンを定義できます。

UseRouting(IApplicationBuilder)メソッドは、要求パイプラインにルーティング ミドルウェアを追加します。 このミドルウェアは、ルーティング情報を処理し、要求ごとに適切なエンドポイントを決定します。 ミドルウェアの処理順序を変更する場合を除き、 UseRouting を明示的に呼び出す必要はありません。

詳細については、「ASP.NET Core のルーティング」および「ASP.NET Core のBlazorルーティングとナビゲーション」を参照してください。

エラー処理

ASP.NET Core には、次などのエラー処理用の機能が組み込まれています。

  • 開発者例外ページ
  • カスタム エラー ページ
  • 静的状態コード ページ
  • 起動時の例外処理

詳細については、「 ASP.NET Core のエラーを処理する」を参照してください。

HTTP 要求を行う

IHttpClientFactory インスタンスの作成に、HttpClient の実装を使用できます。 ファクトリは次のことを行います。

  • 論理 HttpClient インスタンスの名前付けと構成を一元化します。 たとえば、GitHub にアクセスするために、github クライアントを登録して構成します。 既定のクライアントを別の目的で登録して構成します。
  • 複数のデリゲート ハンドラーを登録してチェーン化し、送信要求ミドルウェア パイプラインを構築するのをサポートしています。 このパターンは、ASP.NET Core の受信ミドルウェア パイプラインに似ています。 このパターンでは、キャッシュ、エラー処理、シリアル化、ログ記録など、HTTP 要求に関する横断的関心事を管理するためのメカニズムが提供されます。
  • 一時的な障害処理用の人気のサードパーティ製ライブラリ、Polly と統合できます。
  • 基になっている HttpClientHandler インスタンスのプールと有効期間を管理し、HttpClient の有効期間を手動で管理するときに発生する一般的な DNS の問題を防ぎます。
  • ファクトリによって作成されたクライアントから送信されるすべての要求に対し、構成可能なログ エクスペリエンスを ILogger を介して追加します。

詳細については、「ASP.NET Core で IHttpClientFactory を使用して HTTP 要求を行う」を参照してください。

コンテンツ ルート

コンテンツ ルートは、以下に対する基本パスです。

  • アプリをホストしている実行可能ファイル (.exe)。
  • アプリを構成するコンパイル済みアセンブリ (.dll)。
  • 次のような、アプリで使用されるコンテンツ ファイル。
    • Razor ファイル (.cshtml.razor)
    • 構成ファイル (.json.xml)
    • データ ファイル (.db)
  • Web ルート (通常は wwwroot フォルダー)。

開発中、コンテンツ ルートの既定値は、プロジェクトのルート ディレクトリです。 このディレクトリは、アプリのコンテンツ ファイルと Web ルートの両方の基本パスでもあります。 ホストを構築するときは、それ自体のパスを設定して別のコンテンツ ルートを指定します。 詳細については、コンテンツ ルートに関するページを参照してください。

Web ルート

Web ルートは、次のような、パブリックで静的なリソース ファイルへの基本パスです。

  • スタイルシート (.css)
  • JavaScript (.js)
  • イメージ (.png.jpg)

既定では、静的ファイルは Web ルート ディレクトリとそのサブディレクトリからのみ提供されます。 Web ルートのパスの既定値は、{コンテンツ ルート}/wwwroot です。 ホストを構築するときは、それ自体のパスを設定して別の Web ルートを指定します。 詳細については、「Web ルート」を参照してください。

プロジェクト ファイル内の を使用して、< にファイルを発行できないようにします。 次の例では、wwwroot/local とそのサブディレクトリにコンテンツを公開しないようにします。

<ItemGroup>
  <Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>

Razor .cshtml ファイルの場合、~/ が Web ルートを指します。 ~/ で始まるパスは、"仮想パス" と呼ばれます。

詳細については、「ASP.NET Core の静的ファイル」をご覧ください。

その他のリソース

この記事では、依存関係の挿入 (DI)、構成、ミドルウェアなど、ASP.NET Core アプリを構築するための基礎の概要について説明します。

Program.cs

Web テンプレートを使用して作成した ASP.NET Core アプリでは、Program.cs ファイルにアプリケーション スタートアップ コードが入っています。 Program.cs ファイルは、次のような場所です。

以下をサポートするアプリ スタートアップ コードを示します。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

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

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

依存性の注入 (サービス)

ASP.NET Core には、構成済みのサービスをアプリ全体で利用できるようにする依存関係の挿入 (DI) が含まれています。 サービスは WebApplicationBuilder.Services (前述のコードの builder.Services) を使用して DI コンテナーに追加されます。 WebApplicationBuilder がインスタンス化されると、多くのフレームワークによって提供されるサービスが追加されます。 builder は、次のコードでは WebApplicationBuilder です。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

前述の強調表示されたコードでは、builder は、構成、ロギング、および DI コンテナーに追加されている他の多くのサービスを含みます。

次のコードでは、Razor ページ、ビューを備えた MVC コントローラー、およびカスタム DbContext を DI コンテナーに追加します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
   options.UseSqlServer(builder.Configuration.GetConnectionString("RPMovieContext")));

var app = builder.Build();

サービスは通常、コンストラクター挿入を使用して DI から解決されます。 DI フレームワークでは、実行時にこのサービスのインスタンスが提供されます。

次のコードでは、コンストラクターの挿入を使用して、データベース コンテキストとロガーを DI から解決します。

public class IndexModel : PageModel
{
    private readonly RazorPagesMovieContext _context;
    private readonly ILogger<IndexModel> _logger;

    public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
    {
        _context = context;
        _logger = logger;
    }

    public IList<Movie> Movie { get;set; }

    public async Task OnGetAsync()
    {
        _logger.LogInformation("IndexModel OnGetAsync.");
        Movie = await _context.Movie.ToListAsync();
    }
}

ミドルウェア

要求を処理するパイプラインは、一連のミドルウェア コンポーネントとして構成されています。 各コンポーネントによって、HttpContext に対して操作が実行され、パイプラインの次のミドルウェアが呼び出されるか、または要求が終了されます。

通常、ミドルウェア コンポーネントは、Use{Feature} 拡張メソッドを呼び出すことでパイプラインに追加されます。 アプリに追加されたミドルウェアは、次のコードで強調表示されています。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

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

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

詳細については、「ASP.NET Core のミドルウェア」を参照してください。

ホスト

起動時に、ASP.NET Core アプリによってホストがビルドされます。 ホストにより、次のようなアプリのすべてのリソースがカプセル化されます。

  • HTTP サーバーの実装
  • ミドルウェア コンポーネント
  • ログ機能
  • 依存性の注入 (DI) サービス
  • 構成

ASP.NET Core アプリを実行できる次の 3 つの異なるホストがあります。

ASP.NET Core WebApplicationWebApplicationBuilder の種類は、すべての ASP.NET Core テンプレートで推奨されており、使用されます。 WebApplication は .NET での汎用ホストと同様に動作し、同じインターフェイスの多くを公開しますが、構成に必要なコールバックは少なくなります。 ASP.NET Core の WebHost は、下位互換性のためにのみ使用できます。

次の例では、WebApplication をインスタンス化しています。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

WebApplicationBuilder.Build メソッドでは、次のような一連の既定のオプションを使用してホストを構成します。

  • Web サーバーとして Kestrel を使用し、IIS の統合を有効にします。
  • 構成を、appsettings.json、環境変数、コマンド ライン引数、およびその他の構成ソースから読み込みます。
  • ログ出力をコンソールとデバッグ プロバイダーに送ります。

Web 以外のシナリオ

汎用ホストにより、他の種類のアプリで、ログ記録、依存性の注入 (DI)、構成、およびアプリの有効期間管理などの横断的なフレームワーク拡張機能を使えるようになります。 詳細については、「ASP.NET Core の .NET 汎用ホスト」および「ASP.NET Core でホステッド サービスを使用するバックグラウンド タスク」を参照してください。

サーバー

ASP.NET Core アプリは、HTTP 要求をリッスンするために HTTP サーバー実装を使用します。 サーバーは、 に構成したHttpContextのセットとして、アプリへの要求を公開します。

ASP.NET Core では、次のサーバー実装が提供されます。

  • Kestrel は、クロスプラットフォームの Web サーバーです。 Kestrel は IIS を使用してリバース プロキシ構成で実行されることがよくあります。 Kestrel は、ASP.NET Core 2.0 以降で、インターネットに直接公開される一般向けエッジ サーバーとして実行することもできます。
  • IIS HTTP サーバーは、IIS を使用する Windows のサーバーです。 このサーバーでは、ASP.NET Core アプリと IIS が同じプロセスで実行されます。
  • HTTP.sys は、IIS とは一緒に使用しない Windows のサーバーです。

詳細については、「ASP.NET Core での Web サーバーの実装」を参照してください。

構成

ASP.NET Core は、構成プロバイダーの順序付けされたセットから、名前と値のペアの設定を取得する構成フレームワークとなります。 組み込み構成プロバイダーは、.json ファイル、.xml ファイル、環境変数、コマンドライン引数などのさまざまなソースで使用できます。 他のソースをサポートするには、カスタム構成プロバイダーを作成します。

既定では、ASP.NET Core アプリは、appsettings.json、環境変数、コマンド ラインなどから読み取るように構成されます。 アプリの構成が読み込まれると、環境変数からの値によって appsettings.json からの値がオーバーライドされます。

.NET Core には、パスワードなどの機密の構成データの管理に Secret Manager が用意されています。 実稼働の機密情報には、Azure Key Vault を使用することをお勧めします。

詳細については、「ASP.NET Core の構成」を参照してください。

環境

DevelopmentStagingProduction などの実行環境は ASP.NET Core で使用できます。 アプリが実行している環境は、ASPNETCORE_ENVIRONMENT 環境変数を設定することにより指定します。 ASP.NET Core は、アプリの起動時にその環境変数を読み取り、その値を IWebHostEnvironment 実装に格納します。 この実装は、依存性の注入 (DI) を介して、アプリ内の任意の場所で使用できます。

次の例では、 環境で実行されて "いない" 場合に、例外ハンドラーと Development ミドルウェアを構成します。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

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

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

詳細については、「ASP.NET Core で複数の環境を使用する」を参照してください。

ログ機能

ASP.NET Core では、さまざまな組み込みのサードパーティ製のログ記録プロバイダーと連携するログ記録 API がサポートされています。 使用可能なプロバイダーは次のとおりです。

  • コンソール
  • デバッグ
  • Windows でのイベント トレース
  • Windows イベント ログ
  • TraceSource
  • Azure App Service
  • Azure Application Insights

ログを作成するには、依存性の挿入 (DI) から ILogger<TCategoryName> サービスを解決し、LogInformation などのログ メソッドを呼び出します。 次に例を示します。

public class IndexModel : PageModel
{
    private readonly RazorPagesMovieContext _context;
    private readonly ILogger<IndexModel> _logger;

    public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
    {
        _context = context;
        _logger = logger;
    }

    public IList<Movie> Movie { get;set; }

    public async Task OnGetAsync()
    {
        _logger.LogInformation("IndexModel OnGetAsync.");
        Movie = await _context.Movie.ToListAsync();
    }
}

詳細については、「.NET Core と ASP.NET Core でのログ記録」を参照してください。

ルート指定

ルートとは、ハンドラーにマップされている URL のパターンです。 このハンドラーは一般的には Razor ページ、MVC コントローラーのアクション メソッドまたはミドルウェアです。 ASP.NET Core のルーティングでは、アプリで使用する URL を制御できます。

ASP.NET Core Web アプリケーション テンプレートによって生成された次のコードは、UseRouting を呼び出します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

詳細については、「ASP.NET Core のルーティング」を参照してください。

エラー処理

ASP.NET Core には、次などのエラー処理用の機能が組み込まれています。

  • 開発者例外ページ
  • カスタム エラー ページ
  • 静的状態コード ページ
  • 起動時の例外処理

詳細については、「 ASP.NET Core のエラーを処理する」を参照してください。

HTTP 要求を行う

IHttpClientFactory インスタンスの作成に、HttpClient の実装を使用できます。 ファクトリは次のことを行います。

  • 論理 HttpClient インスタンスの名前付けと構成を一元化します。 たとえば、GitHub にアクセスするために、github クライアントを登録して構成します。 既定のクライアントを別の目的で登録して構成します。
  • 複数のデリゲート ハンドラーを登録してチェーン化し、送信要求ミドルウェア パイプラインを構築するのをサポートしています。 このパターンは、ASP.NET Core の受信ミドルウェア パイプラインに似ています。 このパターンでは、キャッシュ、エラー処理、シリアル化、ログ記録など、HTTP 要求に関する横断的関心事を管理するためのメカニズムが提供されます。
  • 一時的な障害処理用の人気のサードパーティ製ライブラリ、Polly と統合できます。
  • 基になっている HttpClientHandler インスタンスのプールと有効期間を管理し、HttpClient の有効期間を手動で管理するときに発生する一般的な DNS の問題を防ぎます。
  • ファクトリによって作成されたクライアントから送信されるすべての要求に対し、構成可能なログ エクスペリエンスを ILogger を介して追加します。

詳細については、「ASP.NET Core で IHttpClientFactory を使用して HTTP 要求を行う」を参照してください。

コンテンツ ルート

コンテンツ ルートは、以下に対する基本パスです。

  • アプリをホストしている実行可能ファイル (.exe)。
  • アプリを構成するコンパイル済みアセンブリ (.dll)。
  • 次のような、アプリで使用されるコンテンツ ファイル。
    • Razor ファイル (.cshtml.razor)
    • 構成ファイル (.json.xml)
    • データ ファイル (.db)
  • Web ルート (通常は wwwroot フォルダー)。

開発中、コンテンツ ルートの既定値は、プロジェクトのルート ディレクトリです。 このディレクトリは、アプリのコンテンツ ファイルと Web ルートの両方の基本パスでもあります。 ホストを構築するときは、それ自体のパスを設定して別のコンテンツ ルートを指定します。 詳細については、コンテンツ ルートに関するページを参照してください。

Web ルート

Web ルートは、次のような、パブリックで静的なリソース ファイルへの基本パスです。

  • スタイルシート (.css)
  • JavaScript (.js)
  • イメージ (.png.jpg)

既定では、静的ファイルは Web ルート ディレクトリとそのサブディレクトリからのみ提供されます。 Web ルートのパスの既定値は、{コンテンツ ルート}/wwwroot です。 ホストを構築するときは、それ自体のパスを設定して別の Web ルートを指定します。 詳細については、「Web ルート」を参照してください。

プロジェクト ファイル内の を使用して、< にファイルを発行できないようにします。 次の例では、wwwroot/local とそのサブディレクトリにコンテンツを公開しないようにします。

<ItemGroup>
  <Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>

Razor .cshtml ファイルの場合、~/ が Web ルートを指します。 ~/ で始まるパスは、"仮想パス" と呼ばれます。

詳細については、「ASP.NET Core の静的ファイル」をご覧ください。

その他のリソース

この記事では、依存関係の挿入 (DI)、構成、ミドルウェアなど、ASP.NET Core アプリを構築するための基礎の概要について説明します。

Startup クラス

Startup クラスとは、次のとおりです。

  • アプリで必要なサービスが構成されています。
  • 要求を処理するアプリのパイプラインは、一連のミドルウェア コンポーネントとして定義されます。

Startup クラスの例を次に示します。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<RazorPagesMovieContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));

        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapDefaultControllerRoute();
            endpoints.MapRazorPages();
        });
    }
}

詳細については、「ASP.NET Core でのアプリケーションのスタートアップ」をご覧ください。

依存性の注入 (サービス)

ASP.NET Core には、構成済みのサービスをアプリ全体で利用できるようにする依存性の注入 (DI) フレームワークが組み込まれています。 たとえば、ログ コンポーネントは、サービスです。

サービスを構成 (または登録) するコードが Startup.ConfigureServices メソッドに追加されています。 次に例を示します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<RazorPagesMovieContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));

    services.AddControllersWithViews();
    services.AddRazorPages();
}

サービスは通常、コンストラクター挿入を使用して DI から解決されます。 コンストラクター挿入では、必要な型またはインターフェイスのコンストラクター パラメーターがクラスで宣言されます。 DI フレームワークでは、実行時にこのサービスのインスタンスが提供されます。

次の例では、コンストラクター挿入を使用して、DI から RazorPagesMovieContext を解決します。

public class IndexModel : PageModel
{
    private readonly RazorPagesMovieContext _context;

    public IndexModel(RazorPagesMovieContext context)
    {
        _context = context;
    }

    // ...

    public async Task OnGetAsync()
    {
        Movies = await _context.Movies.ToListAsync();
    }
}

組み込みの制御の反転 (IoC) コンテナーがアプリのすべてのニーズを満たしていない場合は、代わりにサードパーティの IoC コンテナーを使用できます。

詳細については、「ASP.NET Core での依存関係の挿入」を参照してください。

ミドルウェア

要求を処理するパイプラインは、一連のミドルウェア コンポーネントとして構成されています。 各コンポーネントによって、HttpContext に対して操作が実行され、パイプラインの次のミドルウェアが呼び出されるか、または要求が終了されます。

通常、ミドルウェア コンポーネントは、Use... メソッドの Startup.Configure 拡張メソッドを呼び出すことでパイプラインに追加されます。 たとえば、静的ファイルのレンダリングを有効にするには、UseStaticFiles を呼び出します。

次の例では、要求を処理するパイプラインを構成します。

public void Configure(IApplicationBuilder app)
{
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
        endpoints.MapRazorPages();
    });
}

ASP.NET Core には、豊富な組み込みミドルウェアのセットが含まれています。 カスタム ミドルウェア コンポーネントを作成することもできます。

詳細については、「ASP.NET Core のミドルウェア」を参照してください。

ホスト

起動時に、ASP.NET Core アプリによってホストがビルドされます。 ホストにより、次のようなアプリのすべてのリソースがカプセル化されます。

  • HTTP サーバーの実装
  • ミドルウェア コンポーネント
  • ログ機能
  • 依存性の注入 (DI) サービス
  • 構成

2 つの異なるホストがあります。

  • .NET での汎用ホスト
  • ASP.NET Core の Web ホスト

.NET での汎用ホストをお勧めします。 ASP.NET Core の Web ホストは、下位互換性のためにのみ使用できます。

次の例では、.NET での汎用ホストを作成します。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

CreateDefaultBuilderConfigureWebHostDefaults メソッドでは、次のような既定のオプションのセットを使用してホストが構成されます。

  • Web サーバーとして Kestrel を使用し、IIS の統合を有効にします。
  • 構成を、appsettings.jsonappsettings.{Environment}.json、環境変数、コマンド ライン引数、およびその他の構成ソースから読み込みます。
  • ログ出力をコンソールとデバッグ プロバイダーに送ります。

詳細については、「ASP.NET Core の .NET 汎用ホスト」を参照してください。

Web 以外のシナリオ

汎用ホストにより、他の種類のアプリで、ログ記録、依存性の注入 (DI)、構成、およびアプリの有効期間管理などの横断的なフレームワーク拡張機能を使えるようになります。 詳細については、「ASP.NET Core の .NET 汎用ホスト」および「ASP.NET Core でホステッド サービスを使用するバックグラウンド タスク」を参照してください。

サーバー

ASP.NET Core アプリは、HTTP 要求をリッスンするために HTTP サーバー実装を使用します。 サーバーは、 に構成したHttpContextのセットとして、アプリへの要求を公開します。

ASP.NET Core では、次のサーバー実装が提供されます。

  • Kestrel は、クロスプラットフォームの Web サーバーです。 Kestrel は IIS を使用してリバース プロキシ構成で実行されることがよくあります。 Kestrel は、ASP.NET Core 2.0 以降で、インターネットに直接公開される一般向けエッジ サーバーとして実行することもできます。
  • IIS HTTP サーバーは、IIS を使用する Windows のサーバーです。 このサーバーでは、ASP.NET Core アプリと IIS が同じプロセスで実行されます。
  • HTTP.sys は、IIS とは一緒に使用しない Windows のサーバーです。

詳細については、「ASP.NET Core での Web サーバーの実装」を参照してください。

構成

ASP.NET Core は、構成プロバイダーの順序付けされたセットから、名前と値のペアの設定を取得する構成フレームワークとなります。 組み込み構成プロバイダーは、.json ファイル、.xml ファイル、環境変数、コマンドライン引数などのさまざまなソースで使用できます。 他のソースをサポートするには、カスタム構成プロバイダーを作成します。

既定では、ASP.NET Core アプリは、appsettings.json、環境変数、コマンド ラインなどから読み取るように構成されます。 アプリの構成が読み込まれると、環境変数からの値によって appsettings.json からの値がオーバーライドされます。

関連する構成値を読み取る方法としては、オプション パターンを使用することをお勧めします。 詳細については、「オプションパターンを使用して、階層型の構成データをバインドします」を参照してください。

.NET Core には、パスワードなどの機密の構成データの管理に Secret Manager が用意されています。 実稼働の機密情報には、Azure Key Vault を使用することをお勧めします。

詳細については、「ASP.NET Core の構成」を参照してください。

環境

DevelopmentStagingProduction などの実行環境は ASP.NET Core の最上の概念です。 アプリが実行している環境は、ASPNETCORE_ENVIRONMENT 環境変数を設定することにより指定します。 ASP.NET Core は、アプリの起動時にその環境変数を読み取り、その値を IWebHostEnvironment 実装に格納します。 この実装は、依存性の注入 (DI) を介して、アプリ内の任意の場所で使用できます。

次の例では、Development 環境で実行するときに詳細なエラー情報を提供するようにアプリを構成します。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
        endpoints.MapRazorPages();
    });
}

詳細については、「ASP.NET Core で複数の環境を使用する」を参照してください。

ログ機能

ASP.NET Core では、さまざまな組み込みのサードパーティ製のログ記録プロバイダーと連携するログ記録 API がサポートされています。 使用可能なプロバイダーは次のとおりです。

  • コンソール
  • デバッグ
  • Windows でのイベント トレース
  • Windows イベント ログ
  • TraceSource
  • Azure App Service
  • Azure Application Insights

ログを作成するには、依存性の挿入 (DI) から ILogger<TCategoryName> サービスを解決し、LogInformation などのログ メソッドを呼び出します。 次に例を示します。

public class TodoController : ControllerBase
{
    private readonly ILogger _logger;

    public TodoController(ILogger<TodoController> logger)
    {
        _logger = logger;
    }

    [HttpGet("{id}", Name = "GetTodo")]
    public ActionResult<TodoItem> GetById(string id)
    {
        _logger.LogInformation(LoggingEvents.GetItem, "Getting item {Id}", id);
        
        // Item lookup code removed.
        
        if (item == null)
        {
            _logger.LogWarning(LoggingEvents.GetItemNotFound, "GetById({Id}) NOT FOUND", id);
            return NotFound();
        }
        
        return item;
    }
}

LogInformation などのログ メソッドでは、任意の数のフィールドがサポートされます。 これらのフィールドは、一般的にメッセージ string を構築するために使用しますが、一部のログ プロバイダーは、それらを個別のフィールドとしてデータ ストアに送信します。 この機能は、構造化ロギングとも呼ばれるセマンティック ロギングをログ プロバイダーが実装するのを可能にします。

詳細については、「.NET Core と ASP.NET Core でのログ記録」を参照してください。

ルート指定

ルートとは、ハンドラーにマップされている URL のパターンです。 このハンドラーは一般的には Razor ページ、MVC コントローラーのアクション メソッドまたはミドルウェアです。 ASP.NET Core のルーティングでは、アプリで使用する URL を制御できます。

詳細については、「ASP.NET Core のルーティング」を参照してください。

エラー処理

ASP.NET Core には、次などのエラー処理用の機能が組み込まれています。

  • 開発者例外ページ
  • カスタム エラー ページ
  • 静的状態コード ページ
  • 起動時の例外処理

詳細については、「 ASP.NET Core のエラーを処理する」を参照してください。

HTTP 要求を行う

IHttpClientFactory インスタンスの作成に、HttpClient の実装を使用できます。 ファクトリは次のことを行います。

  • 論理 HttpClient インスタンスの名前付けと構成を一元化します。 たとえば、GitHub にアクセスするために、github クライアントを登録して構成します。 既定のクライアントを別の目的で登録して構成します。
  • 複数のデリゲート ハンドラーを登録してチェーン化し、送信要求ミドルウェア パイプラインを構築するのをサポートしています。 このパターンは、ASP.NET Core の受信ミドルウェア パイプラインに似ています。 このパターンでは、キャッシュ、エラー処理、シリアル化、ログ記録など、HTTP 要求に関する横断的関心事を管理するためのメカニズムが提供されます。
  • 一時的な障害処理用の人気のサードパーティ製ライブラリ、Polly と統合できます。
  • 基になっている HttpClientHandler インスタンスのプールと有効期間を管理し、HttpClient の有効期間を手動で管理するときに発生する一般的な DNS の問題を防ぎます。
  • ファクトリによって作成されたクライアントから送信されるすべての要求に対し、構成可能なログ エクスペリエンスを ILogger を介して追加します。

詳細については、「ASP.NET Core で IHttpClientFactory を使用して HTTP 要求を行う」を参照してください。

コンテンツ ルート

コンテンツ ルートは、以下に対する基本パスです。

  • アプリをホストしている実行可能ファイル (.exe)。
  • アプリを構成するコンパイル済みアセンブリ (.dll)。
  • 次のような、アプリで使用されるコンテンツ ファイル。
    • Razor ファイル (.cshtml.razor)
    • 構成ファイル (.json.xml)
    • データ ファイル (.db)
  • Web ルート (通常は wwwroot フォルダー)。

開発中、コンテンツ ルートの既定値は、プロジェクトのルート ディレクトリです。 このディレクトリは、アプリのコンテンツ ファイルと Web ルートの両方の基本パスでもあります。 ホストを構築するときは、それ自体のパスを設定して別のコンテンツ ルートを指定します。 詳細については、コンテンツ ルートに関するページを参照してください。

Web ルート

Web ルートは、次のような、パブリックで静的なリソース ファイルへの基本パスです。

  • スタイルシート (.css)
  • JavaScript (.js)
  • イメージ (.png.jpg)

既定では、静的ファイルは Web ルート ディレクトリとそのサブディレクトリからのみ提供されます。 Web ルートのパスの既定値は、{コンテンツ ルート}/wwwroot です。 ホストを構築するときは、それ自体のパスを設定して別の Web ルートを指定します。 詳細については、「Web ルート」を参照してください。

プロジェクト ファイル内の を使用して、< にファイルを発行できないようにします。 次の例では、wwwroot/local とそのサブディレクトリにコンテンツを公開しないようにします。

<ItemGroup>
  <Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>

Razor .cshtml ファイルの場合、チルダとスラッシュ (~/) が Web ルートを指します。 ~/ で始まるパスは、"仮想パス" と呼ばれます。

詳細については、「ASP.NET Core の静的ファイル」をご覧ください。

この記事では、依存関係の挿入 (DI)、構成、ミドルウェアなど、ASP.NET Core アプリを構築するための基礎の概要について説明します。

このノードのガイダンスを追加または置き換える Blazor の基礎ガイダンスについては、ASP.NET Core Blazor の基礎をご覧ください。

Program.cs

Web テンプレートを使用して作成した ASP.NET Core アプリでは、Program.cs ファイルにアプリケーション スタートアップ コードが入っています。 Program.cs ファイルは、次のような場所です。

以下をサポートするアプリ スタートアップ コードを示します。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

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

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

依存性の注入 (サービス)

ASP.NET Core には、構成済みのサービスをアプリ全体で利用できるようにする依存関係の挿入 (DI) が含まれています。 サービスは WebApplicationBuilder.Services (前述のコードの builder.Services) を使用して DI コンテナーに追加されます。 WebApplicationBuilder がインスタンス化されると、多くのフレームワークによって提供されるサービスが追加されます。 builder は、次のコードでは WebApplicationBuilder です。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

前述の強調表示されたコードでは、builder は、構成、ロギング、および DI コンテナーに追加されている他の多くのサービスを含みます。

次のコードでは、Razor ページ、ビューを備えた MVC コントローラー、およびカスタム DbContext を DI コンテナーに追加します。

using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
   options.UseSqlServer(builder.Configuration.GetConnectionString("RPMovieContext")));

var app = builder.Build();

サービスは通常、コンストラクター挿入を使用して DI から解決されます。 DI フレームワークでは、実行時にこのサービスのインスタンスが提供されます。

次のコードでは、コンストラクターの挿入を使用して、データベース コンテキストとロガーを DI から解決します。

public class IndexModel : PageModel
{
    private readonly RazorPagesMovieContext _context;
    private readonly ILogger<IndexModel> _logger;

    public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
    {
        _context = context;
        _logger = logger;
    }

    public IList<Movie> Movie { get;set; }

    public async Task OnGetAsync()
    {
        _logger.LogInformation("IndexModel OnGetAsync.");
        Movie = await _context.Movie.ToListAsync();
    }
}

ミドルウェア

要求を処理するパイプラインは、一連のミドルウェア コンポーネントとして構成されています。 各コンポーネントによって、HttpContext に対して操作が実行され、パイプラインの次のミドルウェアが呼び出されるか、または要求が終了されます。

通常、ミドルウェア コンポーネントは、Use{Feature} 拡張メソッドを呼び出すことでパイプラインに追加されます。 アプリに追加されたミドルウェアは、次のコードで強調表示されています。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

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

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

詳細については、「ASP.NET Core のミドルウェア」を参照してください。

ホスト

起動時に、ASP.NET Core アプリによってホストがビルドされます。 ホストにより、次のようなアプリのすべてのリソースがカプセル化されます。

  • HTTP サーバーの実装
  • ミドルウェア コンポーネント
  • ログ機能
  • 依存性の注入 (DI) サービス
  • 構成

ASP.NET Core アプリを実行できる次の 3 つの異なるホストがあります。

ASP.NET Core WebApplicationWebApplicationBuilder の種類は、すべての ASP.NET Core テンプレートで推奨されており、使用されます。 WebApplication は .NET での汎用ホストと同様に動作し、同じインターフェイスの多くを公開しますが、構成に必要なコールバックは少なくなります。 ASP.NET Core の WebHost は、下位互換性のためにのみ使用できます。

次の例では、WebApplication をインスタンス化しています。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

WebApplicationBuilder.Build メソッドでは、次のような一連の既定のオプションを使用してホストを構成します。

  • Web サーバーとして Kestrel を使用し、IIS の統合を有効にします。
  • 構成を、appsettings.json、環境変数、コマンド ライン引数、およびその他の構成ソースから読み込みます。
  • ログ出力をコンソールとデバッグ プロバイダーに送ります。

Web 以外のシナリオ

汎用ホストにより、他の種類のアプリで、ログ記録、依存性の注入 (DI)、構成、およびアプリの有効期間管理などの横断的なフレームワーク拡張機能を使えるようになります。 詳細については、「ASP.NET Core の .NET 汎用ホスト」および「ASP.NET Core でホステッド サービスを使用するバックグラウンド タスク」を参照してください。

サーバー

ASP.NET Core アプリは、HTTP 要求をリッスンするために HTTP サーバー実装を使用します。 サーバーは、 に構成したHttpContextのセットとして、アプリへの要求を公開します。

ASP.NET Core では、次のサーバー実装が提供されます。

  • Kestrel は、クロスプラットフォームの Web サーバーです。 Kestrel は IIS を使用してリバース プロキシ構成で実行されることがよくあります。 Kestrel は、ASP.NET Core 2.0 以降で、インターネットに直接公開される一般向けエッジ サーバーとして実行することもできます。
  • IIS HTTP サーバーは、IIS を使用する Windows のサーバーです。 このサーバーでは、ASP.NET Core アプリと IIS が同じプロセスで実行されます。
  • HTTP.sys は、IIS とは一緒に使用しない Windows のサーバーです。

詳細については、「ASP.NET Core での Web サーバーの実装」を参照してください。

構成

ASP.NET Core は、構成プロバイダーの順序付けされたセットから、名前と値のペアの設定を取得する構成フレームワークとなります。 組み込み構成プロバイダーは、.json ファイル、.xml ファイル、環境変数、コマンドライン引数などのさまざまなソースで使用できます。 他のソースをサポートするには、カスタム構成プロバイダーを作成します。

既定では、ASP.NET Core アプリは、appsettings.json、環境変数、コマンド ラインなどから読み取るように構成されます。 アプリの構成が読み込まれると、環境変数からの値によって appsettings.json からの値がオーバーライドされます。

.NET Core には、パスワードなどの機密の構成データの管理に Secret Manager が用意されています。 実稼働の機密情報には、Azure Key Vault を使用することをお勧めします。

詳細については、「ASP.NET Core の構成」を参照してください。

環境

DevelopmentStagingProduction などの実行環境は ASP.NET Core で使用できます。 アプリが実行している環境は、ASPNETCORE_ENVIRONMENT 環境変数を設定することにより指定します。 ASP.NET Core は、アプリの起動時にその環境変数を読み取り、その値を IWebHostEnvironment 実装に格納します。 この実装は、依存性の注入 (DI) を介して、アプリ内の任意の場所で使用できます。

次の例では、 環境で実行されて "いない" 場合に、例外ハンドラーと Development ミドルウェアを構成します。

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthorization();

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

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

詳細については、「ASP.NET Core で複数の環境を使用する」を参照してください。

ログ機能

ASP.NET Core では、さまざまな組み込みのサードパーティ製のログ記録プロバイダーと連携するログ記録 API がサポートされています。 使用可能なプロバイダーは次のとおりです。

  • コンソール
  • デバッグ
  • Windows でのイベント トレース
  • Windows イベント ログ
  • TraceSource
  • Azure App Service
  • Azure Application Insights

ログを作成するには、依存性の挿入 (DI) から ILogger<TCategoryName> サービスを解決し、LogInformation などのログ メソッドを呼び出します。 次に例を示します。

public class IndexModel : PageModel
{
    private readonly RazorPagesMovieContext _context;
    private readonly ILogger<IndexModel> _logger;

    public IndexModel(RazorPagesMovieContext context, ILogger<IndexModel> logger)
    {
        _context = context;
        _logger = logger;
    }

    public IList<Movie> Movie { get;set; }

    public async Task OnGetAsync()
    {
        _logger.LogInformation("IndexModel OnGetAsync.");
        Movie = await _context.Movie.ToListAsync();
    }
}

詳細については、「.NET Core と ASP.NET Core でのログ記録」を参照してください。

ルート指定

ルートとは、ハンドラーにマップされている URL のパターンです。 このハンドラーは一般的には Razor ページ、MVC コントローラーのアクション メソッドまたはミドルウェアです。 ASP.NET Core のルーティングでは、アプリで使用する URL を制御できます。

ASP.NET Core Web アプリケーション テンプレートによって生成された次のコードは、UseRouting を呼び出します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

詳細については、「ASP.NET Core のルーティング」を参照してください。

エラー処理

ASP.NET Core には、次などのエラー処理用の機能が組み込まれています。

  • 開発者例外ページ
  • カスタム エラー ページ
  • 静的状態コード ページ
  • 起動時の例外処理

詳細については、「 ASP.NET Core のエラーを処理する」を参照してください。

HTTP 要求を行う

IHttpClientFactory インスタンスの作成に、HttpClient の実装を使用できます。 ファクトリは次のことを行います。

  • 論理 HttpClient インスタンスの名前付けと構成を一元化します。 たとえば、GitHub にアクセスするために、github クライアントを登録して構成します。 既定のクライアントを別の目的で登録して構成します。
  • 複数のデリゲート ハンドラーを登録してチェーン化し、送信要求ミドルウェア パイプラインを構築するのをサポートしています。 このパターンは、ASP.NET Core の受信ミドルウェア パイプラインに似ています。 このパターンでは、キャッシュ、エラー処理、シリアル化、ログ記録など、HTTP 要求に関する横断的関心事を管理するためのメカニズムが提供されます。
  • 一時的な障害処理用の人気のサードパーティ製ライブラリ、Polly と統合できます。
  • 基になっている HttpClientHandler インスタンスのプールと有効期間を管理し、HttpClient の有効期間を手動で管理するときに発生する一般的な DNS の問題を防ぎます。
  • ファクトリによって作成されたクライアントから送信されるすべての要求に対し、構成可能なログ エクスペリエンスを ILogger を介して追加します。

詳細については、「ASP.NET Core で IHttpClientFactory を使用して HTTP 要求を行う」を参照してください。

コンテンツ ルート

コンテンツ ルートは、以下に対する基本パスです。

  • アプリをホストしている実行可能ファイル (.exe)。
  • アプリを構成するコンパイル済みアセンブリ (.dll)。
  • 次のような、アプリで使用されるコンテンツ ファイル。
    • Razor ファイル (.cshtml.razor)
    • 構成ファイル (.json.xml)
    • データ ファイル (.db)
  • Web ルート (通常は wwwroot フォルダー)。

開発中、コンテンツ ルートの既定値は、プロジェクトのルート ディレクトリです。 このディレクトリは、アプリのコンテンツ ファイルと Web ルートの両方の基本パスでもあります。 ホストを構築するときは、それ自体のパスを設定して別のコンテンツ ルートを指定します。 詳細については、コンテンツ ルートに関するページを参照してください。

Web ルート

Web ルートは、次のような、パブリックで静的なリソース ファイルへの基本パスです。

  • スタイルシート (.css)
  • JavaScript (.js)
  • イメージ (.png.jpg)

既定では、静的ファイルは Web ルート ディレクトリとそのサブディレクトリからのみ提供されます。 Web ルートのパスの既定値は、{コンテンツ ルート}/wwwroot です。 ホストを構築するときは、それ自体のパスを設定して別の Web ルートを指定します。 詳細については、「Web ルート」を参照してください。

プロジェクト ファイル内の を使用して、< にファイルを発行できないようにします。 次の例では、wwwroot/local とそのサブディレクトリにコンテンツを公開しないようにします。

<ItemGroup>
  <Content Update="wwwroot\local\**\*.*" CopyToPublishDirectory="Never" />
</ItemGroup>

Razor .cshtml ファイルの場合、~/ が Web ルートを指します。 ~/ で始まるパスは、"仮想パス" と呼ばれます。

詳細については、「ASP.NET Core の静的ファイル」をご覧ください。

その他のリソース