ASP.NET Core
IHttpContextAccessor は、有効な HttpContext が常に使用できるわけではありませんので、対話型レンダリングでは一般に避ける必要があります。
IHttpContextAccessor は、静的なサーバー側レンダリング (静的 SSR) 中に使用できます。たとえば、静的にレンダリングされたルート コンポーネントや、サーバー上の Web API 呼び出しにトークン ハンドラーを使用 する場合などです。 サーバーで実行されている静的 SSR またはコードを保証できない場合は、 IHttpContextAccessor を回避することをお勧めします。
HttpContextは、静的にレンダリングされたルート コンポーネントでのみ、または コンポーネント (App
) のヘッダーやその他のプロパティの検査や変更などの一般的なタスクの静的 SSR の場合にのみApp.razor
として使用できます。 インタラクティブレンダリング中の値はnull
です。
[CascadingParameter]
public HttpContext? HttpContext { get; set; }
高度なエッジ ケースの追加コンテキストについては†次の記事の説明を参照してください。
-
HttpContext は Interactive Server Rendering Blazor ページで有効です (
dotnet/AspNetCore.Docs
#34301) -
Blazor Server で IHttpContextAccessor を使用した場合のセキュリティへの影響 (
dotnet/aspnetcore
#45699)
†この記事の一般的なガイダンスに従って、 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 に関するトピックを参照してください。
ASP.NET Core