Eli*_*lio 4 session asp.net-core blazor
我正在尝试在我的服务器上托管我的 Blazor 应用程序。我整个夏天都在它上面,我刚刚意识到每次我在新设备上打开我的网站时,它都不会创建一个从零重新启动的新会话,而是从我离开的地方继续。最糟糕的是它背后有一个登录系统,所以我现在感觉超级愚蠢。
我真的需要一个关于如何解决这个“不小的”问题的重要提示。有没有办法让服务器在每次有人打开网站时创建新会话(而不会让其他用户松散)?
解决方案应该是使用客户端模板,但性能确实很慢。
更新:帐户“用户密码”是: - user user - test test
[解决方案] itminus 找到了我的问题的解决方案。
ConfigureServices您还必须在 Startup.cs 中添加此services.AddScoped<Storage>();
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<Storage>();
}
Run Code Online (Sandbox Code Playgroud)
每次我在新设备上打开我的网站时,它都不会创建从零重新启动的新会话,而是从我离开的地方继续。
我检查了您的代码,发现您正在使用单例模式来初始化Storage. 如果我理解正确的话,这个Storage单例实例将在不同用户之间(也跨不同设备)共享。由于该实例将用于呈现页面Main.razor,因此您现在会遇到并发问题。
要解决该问题,存储实例应限制在某些特定连接内。当您使用 Blazor 服务器端时,您可以将存储注册为Scoped Service:
在 Blazor Server 应用中,范围服务注册的范围仅限于 连接。因此,对于应限定当前用户范围的服务,首选使用限定范围的服务,即使当前的目的是在浏览器中运行客户端。
首先,删除静态单例实例:
公开课存储
{
私有静态存储实例;
private Storage()
{
}
public static Storage GetInstance()
{
if (Storage.instance == null)
Storage.instance = new Storage();
返回存储实例;
}
public List<Items>list {get;set;} = new List<Items>();
公共字符串密码{get;set;}
}
将该类注册为范围服务:
public class Storage
{
private static Storage instance;
private Storage()
{
}
public static Storage GetInstance()
{
if (Storage.instance == null)
Storage.instance = new Storage();
return Storage.instance;
}
public List<Items>list {get;set;} = new List<Items>();
public string password {get;set;}
}
然后将此服务注入到您的Login.razorand 中Main.razor:
@inject project.Storage Storage
Run Code Online (Sandbox Code Playgroud)
最后,您需要将所有更改Storage.GetInstance().为Storage.:
services.AddScoped<Storage>();
Run Code Online (Sandbox Code Playgroud)
我注意到您还使用单例模式创建Importer/Additional实例。我建议您应该重构它们以以类似的方式使用服务注入。