NET Core 服务器端多会话 Blazor

Eli*_*lio 4 session asp.net-core blazor

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

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

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

更新:帐户“用户密码”是: - user user - test test

下载项目示例(需要Net Core 3.0)

[解决方案] 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)

itm*_*nus 5

每次我在新设备上打开我的网站时,它都不会创建从零重新启动的新会话,而是从我离开的地方继续。

我检查了您的代码,发现您正在使用单例模式来初始化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实例。我建议您应该重构它们以以类似的方式使用服务注入。