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