Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Замечание
Это не последняя версия этой статьи. В текущей версии см. версию .NET 10 этой статьи.
IHttpContextAccessor обычно следует избегать при интерактивном рендеринге, так как допустимый HttpContext не всегда доступен.
IHttpContextAccessor можно использовать во время отрисовки на стороне статического сервера (статический SSR), например в статически отрисованных корневых компонентах, а также при использовании обработчика маркеров для вызовов веб-API на сервере. Рекомендуется избегать использования IHttpContextAccessor в случаях, когда не может быть гарантирован статический SSR или выполнение кода на сервере.
HttpContext можно использовать в качестве каскадного параметра только в статически отображаемых корневых компонентах или во время статического SSR для общих задач, таких как проверка и модификация заголовков или прочих свойств компонента App (App.razor). Значение null во время интерактивной визуализации.
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
Дополнительные сведения о дополнительном контексте в расширенных пограничных случаях† см. в следующих статьях:
-
HttpContext действителен в интерактивной серверной отрисовке страницы Blazor (
dotnet/AspNetCore.Docs#34301) -
Последствия безопасности использования IHttpContextAccessor в Blazor Server (
dotnet/aspnetcore#45699)
†Большинству разработчиков, занимающихся созданием и поддержкой Blazor приложений, не нужно вникать в сложные концепции, если следуют общему руководству в этой статье. Самое важное, что нужно помнить, это то, что HttpContext является в основном серверной функцией запрос-ответ, которая в основном доступна на сервере во время статического SSR и создается только при установлении соединения с пользователем.
Не устанавливайте или не изменяйте заголовки после запуска ответа
Попытка задать или изменить заголовок после первой отрисовки (после запуска ответа) приводит к ошибке:
System.InvalidOperationException: 'Headers are read-only, response has already started.'
Примеры ситуаций, которые приводят к этой ошибке:
- Вызов SignInManager<TUser>.PasswordSignInAsync, который должен задать заголовки для правильной работы Identity, при использовании потоковой отрисовки.
- Попытка задать или изменить заголовок после запуска ответа во время интерактивной отрисовки.
Рекомендации по настройке заголовков перед запуском ответа см. в разделе ASP.NET Запуск CoreBlazor.
Не используйте IHttpContextAccessor/HttpContext прямо или косвенно в компонентах Razor серверных Blazor приложений. Blazor приложения выполняются вне контекста конвейера ASP.NET Core. HttpContext не гарантируется быть доступным в IHttpContextAccessor, так же как и HttpContext не обязательно сохраняет контекст, в котором было запущено приложение Blazor.
Рекомендуемый подход для передачи состояния запроса в приложение Blazor — это использовать параметры корневого компонента при первоначальной отрисовке приложения. В качестве альтернативы приложение может скопировать данные в сервис с ограниченной областью действия в событии жизненного цикла инициализации корневого компонента для использования по всему приложению. Дополнительные сведения см. в разделе о серверной части ASP.NET Core и Blazor Web App дополнительных сценариях безопасности.
Критически важный аспект безопасности Blazor на стороне сервера заключается в том, что пользователь, подключенный к заданному каналу, может быть обновлен в какой-то момент после установки канала Blazor, но IHttpContextAccessorне обновляется. Дополнительные сведения об устранении этой ситуации с пользовательскими службами см. в серверной стороне ASP.NET Core и Blazor Web App дополнительных сценариях безопасности.
Для получения рекомендаций по IHttpContextAccessor и HttpContext в ASP.NET Core SignalR, см. раздел IHttpContextAccessor/HttpContext в ASP.NET Core SignalR.