在服务器端Blazor应用程序中,我想存储一些在页面导航之间保留的状态.我该怎么做?
常规的ASP.NET核心会话状态似乎不可用,因为Session and app sate in ASP.NET Core中的以下注释很可能适用:
Session isn’t supported in 07001
apps because a 07002 may
execute independent of an HTTP context. For example, this can occur
when a long polling request is held open by a hub beyond the lifetime
of the request’s HTTP context.
GitHub问题Add support to SignalR for Session提到您可以使用Context.Items.但我不知道如何使用它,即我不知道如何访问HubConnectionContext实例.
我对会话状态的选择是什么?
最佳答案 @JohnB暗示了穷人对国家的态度:使用范围内的服务.在服务器端Blazor中,作用域服务与SignalR连接相关联.这是您可以获得的会话最接近的事情.它对于单个用户来说当然是私密的.但它也很容易丢失.重新加载页面或修改浏览器地址列表中的URL加载启动一个新的SignalR连接,创建一个新的服务实例,从而失去状态.
所以首先创建状态服务:
public class SessionState
{
public string SomeProperty { get; set; }
public int AnotherProperty { get; set; }
}
然后在App项目的Startup类(而不是服务器项目)中配置服务:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<SessionState>();
}
public void Configure(IBlazorApplicationBuilder app)
{
app.AddComponent<Main>("app");
}
}
现在您可以将状态注入任何Blazor页面:
@inject SessionState state
<p>@state.SomeProperty</p>
<p>@state.AnotherProperty</p>
更好的解决方案仍然受到欢迎.