我正在尝试使用HttpContext.Session
在我的 ASP.NET Core Blazor Server 应用程序中(如此处所述MS Doc https://learn.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-3.1,我的意思是:在启动时全部正确设置)
这是我尝试设置值时的代码部分:
var session = _contextAccessor.HttpContext?.Session;
if (session != null && session.IsAvailable)
{
session.Set(key, data);
await session.CommitAsync();
}
当此代码在 Razor 组件中调用时OnAfterRenderAsync
the session.Set
抛出以下异常:
响应开始后无法建立会话。
我(可能)理解该消息,但这使得会话基础设施相当无法使用:应用程序需要访问它的状态在执行的每个阶段...
Question
我是否应该完全忘记DistributedSession
基础设施,并选择 Cookie 或浏览器会话存储? ...或者这里是否有解决方法仍在利用HttpContext.Session
?我不想仅仅为了较低级别的实现而放弃分布式会话基础设施......
(仅供记录:浏览器的会话存储不跨选项卡,这是一个痛苦)
Blazor 从根本上与传统服务器端会话的概念不兼容,尤其是在客户端或 WebAssembly 托管模型中,因为这些模型一开始就没有服务器端。不过,即使在“服务器端”托管模型中,与服务器的通信也是通过 Websocket 进行的。只有一个初始请求。服务器端会话需要一个 cookie,该 cookie 必须在建立会话时发送到客户端,这意味着only您可以在第一次加载时执行此操作。此后,没有进一步的请求,因此没有机会建立会话。
The docs https://learn.microsoft.com/en-us/aspnet/core/blazor/state-management?view=aspnetcore-3.1#where-to-persist-state提供有关如何维护 Blazor 应用程序中的状态的指导。对于与传统服务器端会话最接近的事情,您正在考虑使用浏览器的sessionStorage
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)