.NET Core服务器端多会话的Blazor应用程序

4
我正在尝试在我的服务器上托管我的Blazor应用程序。我花了整个夏天的时间,只是意识到每次我在新设备上打开我的网站时,它不会重新开始创建一个新的会话,而是继续从我离开的地方继续。最糟糕的部分是有一个登录系统在后面,所以我感觉现在非常愚蠢。
我真的需要一个关于如何解决这个“不小”的问题的提示。有没有办法让服务器在每次有人打开网站时创建新的会话(而不使其他用户失去)?
解决方法应该使用客户端模板,但性能真的太慢了。
更新: 账户“用户名密码”为: - 用户名:user - 密码:user - 用户名:test - 密码:test 下载项目示例(需要Net Core 3.0) 【解决方案】itminus找到了我的问题的解决方案。
还要在Startup.cs中的ConfigureServices中添加以下内容:services.AddScoped();
 public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddScoped<Storage>();
        }

嗨,这听起来像是一个可以解决的问题,但我们需要更多信息才能解决它。虽然我对blazor不太熟悉,但我猜我们至少需要看一些代码后台,以了解您建立会话的方式。 - TylerH
我添加了一些小代码部分。 - Elio
首先,SignalR应用程序不支持会话...我不确定我是否理解了您的描述。 "在新设备上"是什么意思?例如,使用Firefox首次访问应用程序,然后使用Google Chrome?能否解释一下...您的应用程序如何创建新会话?您如何知道“新会话”是“从零重新开始”的? - enet
1个回答

5
每次我在新设备上打开我的网站时,它不会创建一个新的会话从零重新开始,而是继续上次离开的地方。
我检查了你的代码并发现你正在使用单例模式来初始化Storage。如果我理解正确,这个Storage单例实例将在不同的用户之间共享(也跨越不同的设备)。由于这个实例将用于渲染Main.razor页面,所以你现在遇到的问题是并发问题。
为了解决这个问题,Storage实例应该被限制在某个特定的连接中。由于你正在使用Blazor服务器端,你可以将Storage注册为Scoped Service

在Blazor Server应用程序中,范围服务注册是针对连接作用域的。因此,即使当前意图是在浏览器中运行客户端,使用范围服务也是应该针对当前用户进行作用域的服务的首选。

首先,删除静态单例实例:
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;};
}

将此类注册为作用域服务:

services.AddScoped<Storage>();

然后在您的 Login.razorMain.razor 中注入此服务:

@inject project.Storage Storage

最后,您需要将所有的Storage.GetInstance().更改为Storage.:
    Storage.list = Order;
    ...
    Storage.password = password;

我注意到您也使用了单例模式创建Importer/Additional实例。我建议您应该类似地重构它们,使用服务注入。

1
非常感谢。这就是解决方案。还有一个小部分需要在Startup.cs中添加services.AddScoped<Storage>();。我已经在主贴中写了。 - Elio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接