Session NET核心服务器端多会话Blazor

Session NET核心服务器端多会话Blazor,session,asp.net-core,blazor,Session,Asp.net Core,Blazor,我正在尝试在我的服务器上托管Blazor应用程序。 我花了整个夏天在它上面,我才意识到每次我在新设备上打开我的网站,它不会创建一个新的会话从零开始重新启动,而是在我离开它的地方继续。最糟糕的是它背后有一个登录系统,所以我现在觉得自己超级笨 我真的需要一个关于如何解决这个“不小”问题的大提示。 有没有一种方法可以让服务器在每次有人打开网站时创建新会话(而不让其他用户知道) 解决方案应该是使用客户端模板,但是性能确实很慢 更新: “用户密码”帐户包括: -用户用户 -测试 [SOLUTION]it

我正在尝试在我的服务器上托管Blazor应用程序。 我花了整个夏天在它上面,我才意识到每次我在新设备上打开我的网站,它不会创建一个新的会话从零开始重新启动,而是在我离开它的地方继续。最糟糕的是它背后有一个登录系统,所以我现在觉得自己超级笨

我真的需要一个关于如何解决这个“不小”问题的大提示。 有没有一种方法可以让服务器在每次有人打开网站时创建新会话(而不让其他用户知道)

解决方案应该是使用客户端模板,但是性能确实很慢

更新: “用户密码”帐户包括: -用户用户 -测试

[SOLUTION]itminus找到了我的问题的解决方案

您还必须在Startup.cs this
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