Blazor 服务器应用程序中的 HttpContext.Session

g.p*_*dou 4 session httpcontext asp.net-core blazor-server-side

我正在尝试HttpContext.Session在我的 ASP.NET Core Blazor Server 应用程序中使用(如本MS Doc 中所述,我的意思是:在启动时全部正确设置)

这是我尝试设置值时的代码部分:

var session = _contextAccessor.HttpContext?.Session;
if (session != null && session.IsAvailable)
{
    session.Set(key, data);
    await session.CommitAsync();
}
Run Code Online (Sandbox Code Playgroud)

当这个代码在剃刀称为组件OnAfterRenderAsyncsession.Set抛出以下异常:

响应开始后无法建立会话。

我(可能)理解该消息,但这使得 Session 基础设施非常不可用:应用程序需要在执行的每个阶段访问其状态......

我应该完全忘记DistributedSession基础设施,而去使用 Cookies 或浏览器 SessionStorage 吗?...或者这里是否有解决方法仍在使用HttpContext.Session?我不想只是为了较低级别的实现而放弃分布式会话基础设施......

(仅供参考:浏览器的会话存储不是跨选项卡,这很痛苦)

Chr*_*att 6

Blazor 从根本上与传统服务器端会话的概念不兼容,尤其是在没有服务器端开始的客户端或 WebAssembly 托管模型中。即使在“服务器端”托管模型中,与服务器的通信也是通过 websockets 进行的。只有一个初始请求。服务器端会话需要一个 cookie,该 cookie 必须在会话建立时发送给客户端,这意味着您唯一可以做的就是在第一次加载时。之后,没有进一步的请求,因此没有机会建立会话。

这些文档提供了有关如何在 Blazor 应用程序中维护状态的指导。为了与传统的服务器端会话最接近,您正在考虑使用浏览器的sessionStorage.