Session NET核心服务器端多会话Blazor
我正在尝试在我的服务器上托管Blazor应用程序。 我花了整个夏天在它上面,我才意识到每次我在新设备上打开我的网站,它不会创建一个新的会话从零开始重新启动,而是在我离开它的地方继续。最糟糕的是它背后有一个登录系统,所以我现在觉得自己超级笨 我真的需要一个关于如何解决这个“不小”问题的大提示。 有没有一种方法可以让服务器在每次有人打开网站时创建新会话(而不让其他用户知道) 解决方案应该是使用客户端模板,但是性能确实很慢 更新: “用户密码”帐户包括: -用户用户 -测试 [SOLUTION]itminus找到了我的问题的解决方案 您还必须在Startup.cs thisSession NET核心服务器端多会话Blazor,session,asp.net-core,blazor,Session,Asp.net Core,Blazor,我正在尝试在我的服务器上托管Blazor应用程序。 我花了整个夏天在它上面,我才意识到每次我在新设备上打开我的网站,它不会创建一个新的会话从零开始重新启动,而是在我离开它的地方继续。最糟糕的是它背后有一个登录系统,所以我现在觉得自己超级笨 我真的需要一个关于如何解决这个“不小”问题的大提示。 有没有一种方法可以让服务器在每次有人打开网站时创建新会话(而不让其他用户知道) 解决方案应该是使用客户端模板,但是性能确实很慢 更新: “用户密码”帐户包括: -用户用户 -测试 [SOLUTION]it
services.AddScoped()中添加ConfigureServices
代码>
public void配置服务(IServiceCollection服务)
{
services.AddRazorPages();
AddServerSideBlazor();
services.addScope();
}
每次我在新设备上打开我的网站时,它不会创建一个新的会话,从零开始重新启动,而是在我离开的地方继续
我签出您的代码,发现您正在使用单例模式初始化存储
。如果我理解正确,这个存储
单例实例将在不同的用户之间(也在不同的设备之间)共享。由于此实例将用于呈现Main.razor
页面,因此您现在会遇到并发问题
要解决该问题,存储实例应限制在某个特定连接内。在使用Blazor服务器端时,可以将存储注册为:
在Blazor服务器应用程序中,作用域服务注册的作用域为连接。出于这个原因,对于应该限定到当前用户范围的服务,最好使用限定范围的服务,即使当前的目的是在浏览器中运行客户端
首先,删除静态单例实例:
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;}
}
最后,您需要将所有存储.GetInstance()。
更改为存储。
:
Storage.list=订单;
...
Storage.password=密码;
我注意到您还使用Singleton模式创建了导入器
/附加的
实例。我建议您重构它们,以类似的方式使用服务注入。您好,这听起来是一个可以解决的问题,但我们需要更多的信息来解决它。如果对blazor一点也不熟悉,我想我们至少需要看看你建立会话的背后的一些代码。我先添加了一些代码,会话在Signal应用程序中不受支持。。。我不确定我是否理解你的描述。“在新设备上”意味着什么?一个不同的浏览器,比如说你第一次使用FF访问你的应用,然后是谷歌浏览器?想解释一下吗。。。你的应用程序如何创建新会话?您如何知道“新会话”是“从零开始重新启动?”非常感谢。这就是解决办法。还有一小部分需要添加services.addScope()代码>在Startup.cs中。我在主要帖子上写的。
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;}
}
@inject project.Storage Storage