IHttpContextAccessor / HttpContext em aplicativos ASP.NET Core Blazor

Nota

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão do .NET 10 deste artigo.

IHttpContextAccessor geralmente deve ser evitado com a renderização interativa porque um HttpContext válido nem sempre está disponível.

IHttpContextAccessor pode ser usado durante a renderização estática do lado do servidor (SSR estático), por exemplo, em componentes raiz renderizados estaticamente e ao usar um manipulador de token para chamadas de API Web no servidor. É recomendável evitar IHttpContextAccessor quando o SSR estático ou o código em execução no servidor não podem ser garantidos.

HttpContext pode ser usado como um parâmetro em cascata apenas em componentes raiz renderizados estaticamente ou durante a SSR estática para tarefas gerais, como inspecionar e modificar cabeçalhos ou outras propriedades no componente App (App.razor). O valor é null durante a renderização interativa.

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

Para obter contexto adicional em casos extremos† avançados†, consulte a discussão nos seguintes artigos:

A maioria dos desenvolvedores que criam e mantêm Blazor apps não precisam se aprofundar em conceitos avançados quando seguem a orientação geral deste artigo. O conceito mais importante a ter em mente é que HttpContext é fundamentalmente um recurso de solicitação-resposta baseado em servidor que só está disponível no servidor durante o SSR estático e criado apenas quando o circuito de um usuário é estabelecido.

Não defina ou modifique cabeçalhos após o início da resposta

A tentativa de definir ou modificar um cabeçalho após a primeira renderização (após o início da resposta) resulta em um erro:

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

Exemplos de situações que resultam nesse erro incluem:

Para obter diretrizes sobre como definir cabeçalhos antes do início da resposta, consulte Inicialização do ASP.NET CoreBlazor.

Não use IHttpContextAccessor/HttpContext direta ou indiretamente nos componentes Razor de aplicativos Blazor do lado do servidor. Os aplicativos Blazor são executados fora do contexto do pipeline do ASP.NET Core. O HttpContext não tem garantia de estar disponível no IHttpContextAccessore HttpContext não tem garantia de manter o contexto que iniciou o aplicativo Blazor.

A abordagem recomendada para passar o estado da solicitação para o aplicativo Blazor é por meio de parâmetros de componente raiz durante a renderização inicial do aplicativo. Como alternativa, o aplicativo pode copiar os dados para um serviço com escopo no evento de ciclo de vida de inicialização do componente raiz para uso em todo o aplicativo. Para obter mais informações, consulte ASP.NET Core Blazor cenários de segurança adicionais do lado do servidor.

Um aspecto crítico da segurança de Blazor do lado do servidor é que o usuário anexado a determinado circuito pode ser atualizado em algum momento após o circuito Blazor ser estabelecido, mas o IHttpContextAccessornão ser atualizado. Para obter mais informações sobre como lidar com essa situação com serviços personalizados, consulte ASP.NET Core Blazor cenários adicionais de segurança do lado do servidor.

Para obter diretrizes sobre IHttpContextAccessor e HttpContext no ASP.NET Core SignalR, consulte IHttpContextAccessor/HttpContext no ASP.NET Core SignalR.