ASP.NET Core IHttpContextAccessor 应用中的 /HttpContextBlazor

注意

这不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本

重要

此信息与在商业发布之前可能进行大幅修改的预发布产品有关。 Microsoft对此处提供的信息不作任何明示或暗示的保证。

有关当前版本,请参阅本文的 .NET 9 版本

通常应避免使用 IHttpContextAccessor 进行交互式渲染,因为并不总是能获得有效的 HttpContext

IHttpContextAccessor 可以在静态服务器端呈现(静态 SSR)期间使用,例如静态呈现的根组件,并在服务器上 对 Web API 调用使用令牌处理程序 时使用。 建议在无法确保静态 SSR 或代码在服务器上正常运行时避免使用IHttpContextAccessor

HttpContext 只能在静态呈现的根组件中或在常规任务的静态 SSR 中用作 级联参数 ,例如检查和修改组件中的 App 标头或其他属性(App.razor)。 在交互式呈现期间,该值是 null

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

有关 高级 极端案例†的其他上下文,请参阅以下文章中的讨论:

大多数开发人员在遵循本文的一般指南时,构建和维护 Blazor 应用程序时,通常无需深入探讨高级概念。 要记住的最重要概念是 HttpContext ,这是一项基于服务器的请求响应功能,该功能仅在静态 SSR 期间在服务器上正式发布,仅在用户线路建立时创建。

在响应启动后不要设置或修改标头

尝试在第一次呈现后(响应启动后)设置或修改标头会导致错误:

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

导致此错误的情况示例包括:

有关在响应启动前设置标头的指导,请参阅 ASP.NET Core Blazor 启动

请勿在服务器端 IHttpContextAccessor 应用的 / 组件中直接或间接使用 HttpContextRazorBlazor。 Blazor 应用在 ASP.NET 核心管道上下文外部运行。 HttpContext 不能保证在 IHttpContextAccessor内可用,并且不保证 HttpContext 保留启动 Blazor 应用的上下文。

建议在应用的初始呈现期间通过根组件参数将请求状态传递给 Blazor 应用。 或者,应用可以将数据复制到根组件的初始化生命周期事件中的作用域服务中,以便在应用中使用。 有关详细信息,请参阅 ASP.NET 核心服务器端和 Blazor Web App 其他安全方案

服务器端 Blazor 安全性的一个关键方面是,在建立 Blazor 线路后,附加到给定线路的用户可能会在某个时间点更新,但 IHttpContextAccessor不会更新。 有关使用自定义服务解决这种情况的详细信息,请参阅 ASP.NET 核心服务器端和 Blazor Web App 其他安全方案

有关 ASP.NET Core IHttpContextAccessorHttpContext 和 SignalR 的指导,请参阅 ASP.NET Core SignalR中的IHttpContextAccessor/HttpContext。