IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

configurer SignalR pour un fonctionnement dans toutes les vues / Quelle vue est actuellement consultée ?


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 220
    Par défaut configurer SignalR pour un fonctionnement dans toutes les vues / Quelle vue est actuellement consultée ?
    Bonjour,

    J'ai implémenté SignalR en complément d'une messagerie de User à User.
    Je m'en sers pour notifier le destinataire qu'il a reçu un message.

    Cela fonctionne quand le destinataire est déjà en train de consulter sa page de messages.
    SignalR et ses méthodes sont implémentés dans la page "index" de la messagerie.

    Mais, évidemment, l'intérêt de cette notification c'est quand le destinataire ne consulte pas la page de la messagerie.
    Une notification doit alors s'afficher dans la barre du menu principal, sur l’icône de la messagerie.

    Pour fonctionner tout le temps, SignalR doit donc être implémenté dans la page _Layout.

    code "_Layout.cshtml"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
           const connection = new signalR.HubConnectionBuilder()
               .withUrl("/message")
               .configureLogging(signalR.LogLevel.Information)
               .build();
     
           async function start() {
               try {
                       await connection.start();
                   console.log("SignalR Connected.");
               } catch (err) {
                   console.log(err);
                   setTimeout(start, 10000);
               }
           };
     
           connection.onclose(async () => {
               await start();
           });
     
           start();
    Le problème est que, quand le destinataire ne consulte pas sa messagerie, la méthode "ReceiveMessage" n'est pas trouvée.
    Elle se trouve sur la page de la messagerie, que le destinataire ne consulte pas.
    Warning: No client method with the name 'receivemessage' found.
    Évidemment, je ne peux pas placer la méthode "ReceiveMessage" dans le _Layout.
    Car en consultant la messagerie, deux méthodes, celle de messagerie/Index et celle du _Layout auraient le même nom.

    La méthode "ReceiveMessage" dont j'aurais besoin dans le _Layout n'a que seule chose à faire. Mettre un flag sur l'icône "message" du menu principal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById('lblNewMessage').innerHTML="*";
    La méthode "ReceiveMessage" de la page messagerie réalise un long traitement spécifique à la page "messagerie" (inutile de le détailler).

    Idéalement, j'aurais besoin de savoir qu'elle page est actuellement consultée par le destinataire du message.
    Pour faire un choix dans le Hub de SignalR.

    Comme ça, en pseudo code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        public class MSGHub : Hub
        {
             public async Task Send(string User_Exp, string User_Dest, string Topic, string message )
            {
                if(Pageconsultee == "messagerie")
                {
                    await Clients.User(User_Dest).SendAsync("ReceiveMessage", User_Exp, User_Dest, Topic, message);
                }
                else
                {
                    await Clients.User(User_Dest).SendAsync("NotifMessage");
                }
            }
        }
    Avec la nouvelle méthode "NotifMessage" placée dans le _layout.

    C'est la solution à laquelle je pense. Peut-être en voyez-vous une autre ?

    Comment savoir quelle View est actuellement consultée sur le site ?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 220
    Par défaut
    Il n'y a apparemment aucun moyen de savoir quelle page est ouverte par un utilisateur en particulier.
    Comme le dit quelqu'un sur un forum
    Comment le serveur saurait-il si du code HTML est « ouvert » dans un navigateur ?
    Je n'ai trouvé aucune solution, j'ai donc choisi de le faire différemment.

    Tout le code pour SignalR est placé dans le Layout.

    À la réception d'un message je veux savoir si l'utilisateur destinataire est en train de consulter sa messagerie ou pas.
    Je créé une condition avec un élément du document qui n'existe que sur la page messagerie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            connection.on("ReceiveMessage", function(userexp, userdest, topic, message, refresh_status){ // refresh_status est booléen
                var contf = document.querySelector(".fiche"); // fiche n'existe que sur ma page "Messagerie"
     
                if(contf != null)
                 {
                    //code pour la page Messagerie
     
                 }
                 else
                 {
                    //code pour n'importe quelle autre page (PopUp de Notification dans menu principal)
     
                  }
    Consécutivement, en plaçant également le template des messages de notification dans le _Layout, je peux notifier l'utilisateur tout le temps et n'importe où sur le site.
    Je considère ce sujet comme résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/09/2013, 19h30
  2. Réponses: 7
    Dernier message: 08/04/2011, 11h35
  3. Réponses: 8
    Dernier message: 05/10/2009, 16h47
  4. Réponses: 2
    Dernier message: 17/04/2008, 15h27
  5. Réponses: 9
    Dernier message: 05/02/2007, 19h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo