我正在尝试使用 HttpContext.Session
在我的ASP.NET Core Blazor服务器应用程序中(如本篇所述 MS Doc,我的意思是:在启动时全部正确设置)
下面是我试图设置一个值时的代码部分。
var session = _contextAccessor.HttpContext?.Session;
if (session != null && session.IsAvailable)
{
session.Set(key, data);
await session.CommitAsync();
}
当这段代码调用Razor组件的 OnAfterRenderAsync
的 session.Set
抛出以下异常。
响应开始后,会话无法建立。
我(可能)理解了这个消息,但这使得Session基础架构无法使用:应用程序需要访问 其状态 在执行的每个阶段...
疑问
我是否应该完全忘记 DistributedSession
......还是有一个变通的办法,仍然利用了 HttpContext.Session
? 我不希望为了低级别的实现而放弃分布式会话信息......
(只是为了记录在案,Browser的会话存储不是跨标签的,这很麻烦) 浏览器的会话存储不是跨标签的,这很麻烦。)
Blazor与传统的服务器端会话的概念根本不兼容,尤其是在客户端或WebAssembly托管模式下,一开始就没有服务器端。不过即使在 "服务器端 "托管模式下,与服务器的通信也是通过websockets进行的。只有一个初始请求。服务器端的会话需要一个cookie,当会话建立后必须发送给客户端,这意味着 只是 点,你可以做的是在第一次加载。之后,没有进一步的请求,因此也就没有机会建立会话。
在这之后,就没有进一步的请求,也就没有机会建立会话了。文件 就如何在Blazor应用中维护状态提供了指导。对于最接近传统的服务器端会话,您正在寻找使用浏览器的 sessionStorage
.