次の方法で共有


ASP.NET Core IHttpContextAccessor アプリでの /HttpContextBlazor

手記

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

IHttpContextAccessor は、有効な HttpContext が常に使用できるわけではありませんので、対話型レンダリングでは一般に避ける必要があります。

IHttpContextAccessor は、静的なサーバー側レンダリング (静的 SSR) 中に使用できます。たとえば、静的にレンダリングされたルート コンポーネントや、サーバー上の Web API 呼び出しにトークン ハンドラーを使用 する場合などです。 サーバーで実行されている静的 SSR またはコードを保証できない場合は、 IHttpContextAccessor を回避することをお勧めします。

HttpContextは、静的にレンダリングされたルート コンポーネントでのみ、または コンポーネント (App) のヘッダーやその他のプロパティの検査や変更などの一般的なタスクの静的 SSR の場合にのみApp.razorとして使用できます。 インタラクティブレンダリング中の値はnullです。

[CascadingParameter]
private HttpContext? HttpContext { get; set; }

高度なエッジ ケースの追加コンテキストについては†次の記事の説明を参照してください。

†この記事の一般的なガイダンスに従って、 Blazor アプリを構築および保守するほとんどの開発者は、高度な概念を掘り下げる必要はありません。 留意すべき最も重要な概念は、 HttpContext は基本的にサーバー ベースの要求応答機能であり、静的 SSR 中にサーバーでのみ一般公開され、ユーザーの回線が確立されたときにのみ作成されるということです。

応答の開始後にヘッダーを設定または変更しない

最初のレンダリング (応答の開始後) の後にヘッダーを設定または変更しようとすると、エラーが発生します。

System.InvalidOperationException: 'Headers are read-only, response has already started.'

このエラーが発生する状況の例を次に示します。

  • SignInManager<TUser>.PasswordSignInAsyncの呼び出し。Identityを採用する際に、が正しく機能するようにヘッダーを設定する必要があります。
  • 対話型レンダリング中に応答が開始された後にヘッダーを設定または変更しようとしています。

応答が開始される前にヘッダーを設定する方法については、「 ASP.NET Core Blazor の起動」を参照してください。

サーバー側の IHttpContextAccessor アプリの / コンポーネントで直接または間接的に HttpContextRazorBlazor を使用しないでください。 Blazor アプリは、ASP.NET Core パイプライン コンテキストの外部で実行されます。 HttpContext は、IHttpContextAccessor内で使用できる保証はありません。また、HttpContext は、Blazor アプリを起動したコンテキストを保持するとは限りません。

Blazor アプリに要求の状態を渡すための推奨される方法は、アプリの初期レンダリング中にルート コンポーネント パラメーターを使用することです。 または、アプリ全体で使用するために、ルート コンポーネントの初期化ライフサイクル イベントのスコープサービスにデータをコピーすることもできます。 詳細については、「コア サーバー側 ASP.NET および追加のセキュリティ シナリオBlazor Web App」を参照してください。

サーバー側のBlazorセキュリティの重要な側面は、Blazor回線が確立された後に特定の回線に接続されたユーザーがある時点で更新される可能性があるが、IHttpContextAccessorは更新されないという点です。 カスタム サービスを使用してこのような状況に対処する方法の詳細については、「 コア サーバー側の ASP.NET と、追加のセキュリティ シナリオ Blazor Web App 参照してください。

ASP.NET Core IHttpContextAccessor での HttpContext と SignalR に関するガイダンスについては、ASP.NET Core SignalR での IHttpContextAccessor/HttpContext に関するトピックを参照してください。