4 votes

NET Core Server Side session multiple Blazor

J'essaie d'héberger mon application Blazor sur mon serveur. J'ai passé tout l'été dessus et je viens de réaliser qu'à chaque fois que j'ouvre mon site web sur un nouvel appareil, il ne crée pas une nouvelle session en reprenant à zéro, mais continue là où je l'ai laissé. Le pire c'est qu'il y a un système de login derrière, donc je me sens super bête en ce moment.

J'ai vraiment besoin d'un gros indice sur la façon de résoudre ce problème "pas petit". Existe-t-il un moyen de faire en sorte que le serveur crée une nouvelle session chaque fois que quelqu'un ouvre le site Web (sans que les autres utilisateurs ne puissent s'en servir) ?

La solution devrait être d'utiliser un modèle de client à la place, mais les performances sont vraiment trop lentes.

UPDATE : Les comptes "utilisateur mot de passe" sont : - utilisateur utilisateur - test test

Télécharger l'exemple de projet (nécessite Net Core 3.0)

[SOLUTION] itminus a trouvé la solution à mon problème.

Vous devez également ajouter ConfigureServices dans Startup.cs ceci services.AddScoped<Storage>();

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddScoped<Storage>();
        }

4voto

itminus Points 12070

chaque fois que j'ouvre mon site web sur un nouvel appareil, il ne crée pas une nouvelle session en recommençant à zéro, mais continue là où je l'ai laissé.

J'ai vérifié votre code et j'ai constaté que vous utilisez le modèle Singleton pour initialiser l'interface utilisateur. Storage . Si je comprends bien, cette Storage L'instance singleton sera partagée entre différents utilisateurs (et entre différents appareils). Étant donné que cette instance sera utilisée pour effectuer le rendu de l'objet Main.razor il y aura des problèmes de concurrence comme ceux que vous rencontrez actuellement.

Pour résoudre ce problème, l'instance de stockage doit être limitée à une connexion spécifique. Comme vous utilisez Blazor Server Side, vous pouvez enregistrer le stockage comme une instance de Scoped Service :

Dans les applications du serveur Blazor, un enregistrement de service scopé est au niveau de la connexion . C'est pourquoi il est préférable d'utiliser des services scopés pour les services qui doivent être scopés à l'utilisateur actuel, même si l'intention actuelle est de s'exécuter côté client dans le navigateur.

Tout d'abord, supprimez l'instance singleton statique :

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;}**

}

Enregistrez cette classe en tant que service scopé :

services.AddScoped<Storage>();

Et ensuite injecter ce service dans votre Login.razor et Main.razor :

@inject project.Storage Storage

Enfin, vous devez modifier tous les Storage.GetInstance(). à Storage. :

    Storage.list = Order;
    ...
    Storage.password = password;

Je remarque que vous créez aussi le Importer / Additional en utilisant le modèle Singleton. Je vous suggère de les remanier pour utiliser l'injection de services de manière similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X