次の方法で共有


ASP.NET Core の HttpContext にアクセスする

Note

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

警告

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

HttpContext を指定すると、個々の HTTP 要求と応答に関するすべての情報がカプセル化されます。 HttpContext インスタンスは、HTTP 要求の受信時に初期化されます。 HttpContext インスタンスには、ミドルウェアや Web API コントローラー、Razor Pages、SignalR、gRPC などのアプリ フレームワークからアクセスできます。

HTTP の要求と応答での HttpContext の使用について詳しくは、「ASP.NET Core で HttpContext を使用する」をご覧ください。

HttpContext Pages から Razor にアクセスする

Razor Pages PageModel では、PageModel.HttpContext プロパティが公開されます。

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

同じプロパティを対応する Razor ページ ビューで使用できます。

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

MVC の HttpContext ビューから Razor にアクセスする

MVC パターンの Razor ビューには、ビューの HttpContext プロパティを使用して RazorPage.Context が公開されます。 次の例では、Windows 認証を使用して、イントラネット アプリで現在のユーザー名を取得します。

@{
    var username = Context.User.Identity.Name;

    // ...
}

コントローラーから HttpContext にアクセスする

コントローラーは ControllerBase.HttpContext プロパティを公開します。

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;

        // ...

        return View();
    }
}

最小限の API から HttpContext にアクセスする

Minimal API の HttpContext を使用するには、 HttpContext パラメーターを追加します。

app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));

ミドルウェアから HttpContext にアクセスする

カスタム ミドルウェア コンポーネントから HttpContext を使うには、HttpContext または Invoke メソッドに渡された InvokeAsync パラメーターを使います。

public class MyCustomMiddleware
{
    // ...

    public async Task InvokeAsync(HttpContext context)
    {
        // ...
    }
}

HttpContext から SignalR にアクセスする

HttpContext から SignalR を使うには、GetHttpContext に対して Hub.Context メソッドを呼び出します。

public class MyHub : Hub
{
    public async Task SendMessage()
    {
        var httpContext = Context.GetHttpContext();

        // ...
    }
}

gRPC メソッドから HttpContext にアクセスする

gRPC メソッドから HttpContext を使うには、「gRPC メソッドで HttpContext を解決する」をご覧ください。

カスタム コンポーネントから HttpContext にアクセスする

HttpContext へのアクセスを必要とするその他のフレームワークおよびカスタム コンポーネントに対して推奨される方法は、組み込みの依存関係の挿入 (DI) コンテナーを使用して依存関係を登録することです。 DI コンテナーは、それぞれのコンストラクター内で IHttpContextAccessor を依存関係として宣言するすべてのクラスに、これを提供します。

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();

次に例を示します。

  • UserRepositoryIHttpContextAccessor に対する依存関係を宣言します。
  • DI で依存関係のチェーンが解決され、UserRepository のインスタンスが作成されると、依存関係が提供されます。
public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserRepository(IHttpContextAccessor httpContextAccessor) =>
        _httpContextAccessor = httpContextAccessor;

    public void LogCurrentUser()
    {
        var username = _httpContextAccessor.HttpContext.User.Identity.Name;

        // ...
    }
}

バックグラウンド スレッドからの HttpContext アクセス

HttpContext はスレッド セーフではありません。 要求の処理以外で HttpContext のプロパティを読み書きすると、結果的に NullReferenceException になることがあります。

Note

アプリで NullReferenceException エラーが散発的に生成される場合、コードの中で、バックグラウンド処理を開始する部分や要求完了後に処理を続行する部分を見直してください。 コントローラー メソッドを async void として定義するなどの間違いを探します。

HttpContext データでバックグラウンド作業を安全に行うには:

  • 要求処理中に必要なデータをコピーします。
  • コピーしたデータをバックグラウンド タスクに渡します。
  • 並列タスクで データを参照 "しないで" ください。HttpContext 必要なデータは、並列タスクを開始する前にコンテキストから抽出してください。

アンセーフ コードを避けるために、バックグラウンド処理を行わないメソッドには HttpContext を決して渡さないでください。 代わりに必要なデータを渡してください。 次の例では、電子メールの送信を開始するために SendEmailSendEmailCoreAsync を呼びします。 X-Correlation-Id ヘッダーの値は、SendEmailCoreAsync ではなく HttpContext に渡されます。 コードの実行では、SendEmailCoreAsync が完了するのを待機しません。

public class EmailController : Controller
{
    public IActionResult SendEmail(string email)
    {
        var correlationId = HttpContext.Request.Headers["X-Correlation-Id"].ToString();

        _ = SendEmailCoreAsync(correlationId);

        return View();
    }

    private async Task SendEmailCoreAsync(string correlationId)
    {
        // ...
    }
}

IHttpContextAccessor コンポーネント内の /HttpContextRazor (Blazor)

詳細については、core Blazor アプリの IHttpContextAccessor/HttpContext ASP.NETを参照してください。

HttpContext を指定すると、個々の HTTP 要求と応答に関するすべての情報がカプセル化されます。 HttpContext インスタンスは、HTTP 要求の受信時に初期化されます。 HttpContext インスタンスには、ミドルウェアや Web API コントローラー、Razor Pages、SignalR、gRPC などのアプリ フレームワークからアクセスできます。

HTTP の要求と応答での HttpContext の使用について詳しくは、「ASP.NET Core で HttpContext を使用する」をご覧ください。

HttpContext Pages から Razor にアクセスする

Razor Pages PageModel では、PageModel.HttpContext プロパティが公開されます。

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

同じプロパティを対応する Razor ページ ビューで使用できます。

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

MVC の HttpContext ビューから Razor にアクセスする

MVC パターンの Razor ビューには、ビューの HttpContext プロパティを使用して RazorPage.Context が公開されます。 次の例では、Windows 認証を使用して、イントラネット アプリで現在のユーザー名を取得します。

@{
    var username = Context.User.Identity.Name;

    // ...
}

コントローラーから HttpContext にアクセスする

コントローラーは ControllerBase.HttpContext プロパティを公開します。

public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;

        // ...

        return View();
    }
}

ミドルウェアから HttpContext にアクセスする

カスタム ミドルウェア コンポーネントを使用する場合、HttpContextInvoke メソッドまたは InvokeAsync メソッドに渡されます。

public class MyCustomMiddleware
{
    public Task InvokeAsync(HttpContext context)
    {
        // ...
    }
}

カスタム コンポーネントから HttpContext にアクセスする

HttpContext へのアクセスを必要とするその他のフレームワークおよびカスタム コンポーネントに対して推奨される方法は、組み込みの依存関係の挿入 (DI) コンテナーを使用して依存関係を登録することです。 DI コンテナーは、それぞれのコンストラクター内で IHttpContextAccessor を依存関係として宣言するすべてのクラスに、これを提供します。

public void ConfigureServices(IServiceCollection services)
{
     services.AddControllersWithViews();
     services.AddHttpContextAccessor();
     services.AddTransient<IUserRepository, UserRepository>();
}

次に例を示します。

  • UserRepositoryIHttpContextAccessor に対する依存関係を宣言します。
  • DI で依存関係のチェーンが解決され、UserRepository のインスタンスが作成されると、依存関係が提供されます。
public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserRepository(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void LogCurrentUser()
    {
        var username = _httpContextAccessor.HttpContext.User.Identity.Name;
        service.LogAccessRequest(username);
    }
}

バックグラウンド スレッドからの HttpContext アクセス

HttpContext はスレッド セーフではありません。 要求の処理以外で HttpContext のプロパティを読み書きすると、結果的に NullReferenceException になることがあります。

Note

アプリで NullReferenceException エラーが散発的に生成される場合、コードの中で、バックグラウンド処理を開始する部分や要求完了後に処理を続行する部分を見直してください。 コントローラー メソッドを async void として定義するなどの間違いを探します。

HttpContext データでバックグラウンド作業を安全に行うには:

  • 要求処理中に必要なデータをコピーします。
  • コピーしたデータをバックグラウンド タスクに渡します。
  • 並列タスクで データを参照 "しないで" ください。HttpContext 必要なデータは、並列タスクを開始する前にコンテキストから抽出してください。

アンセーフ コードを避けるために、バックグラウンド処理を行わないメソッドには HttpContext を決して渡さないでください。 代わりに必要なデータを渡してください。 次の例では、電子メールの送信を開始するために SendEmailCore が呼び出されます。 correlationId は、SendEmailCore ではなく HttpContext に渡されます。 コードの実行では、SendEmailCore が完了するのを待機しません。

public class EmailController : Controller
{
    public IActionResult SendEmail(string email)
    {
        var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();

        _ = SendEmailCore(correlationId);

        return View();
    }

    private async Task SendEmailCore(string correlationId)
    {
        // ...
    }
}

IHttpContextAccessor コンポーネント内の /HttpContextRazor (Blazor)

詳細については、core Blazor アプリの IHttpContextAccessor/HttpContext ASP.NETを参照してください。