Comment faire pour obtenir l'ID de connexion de signalR client sur le serveur?
J'ai besoin d'obtenir l'ID de connexion d'un client. Je sais que vous pouvez obtenir à partir du côté client à l'aide $.connection.hub.id
. Ce que j'ai besoin est d'obtenir alors que dans un service web, j'ai les mises à jour des enregistrements dans une base de données, à son tour, l'affichage de la mise à jour sur une page web. Je suis nouveau sur signalR et stackoverflow, donc tout conseil serait apprécié. Sur mon client page web, j'ai ceci:
<script type="text/javascript">
$(function () {
//Declare a proxy to reference the hub.
var notify = $.connection.notificationHub;
//Create a function that the hub can call to broadcast messages.
notify.client.broadcastMessage = function (message) {
var encodedMsg = $('<div />').text(message).html();//Html encode display message.
$('#notificationMessageDisplay').append(encodedMsg);//Add the message to the page.
};//end broadcastMessage
//Start the connection.
$.connection.hub.start().done(function () {
$('#btnUpdate').click(function () {
//call showNotification method on hub
notify.server.showNotification($.connection.hub.id, "TEST status");
});
});
});//End Main function
</script>
tout fonctionne jusqu'à ce que je veux mettre à jour la page à l'aide de signalR. Le spectacle de la notification de la fonction dans mon hub est ceci:
//hub function
public void showNotification(string connectionId, string newStatus){
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<notificationHub>();
string connection = "Your connection ID is : " + connectionId;//display for testing
string statusUpdate = "The current status of your request is: " + newStatus;//to be displayed
//for testing, you can display the connectionId in the broadcast message
context.Clients.Client(connectionId).broadcastMessage(connection + " " + statusUpdate);
}//end show notification
comment puis-je envoyer le connectionid à mon service web?
J'espère que je ne suis pas en train de faire quelque chose d'impossible. Merci à l'avance.
- Le deuxième extrait de code n'a pas de format pour une raison quelconque. Désolé
- comment savez-vous quel client que vous souhaitez mettre à jour?
- aussi: pourquoi êtes-vous manuellement la création d'un hub exemple, si vous allez utiliser GetHubContext?
- Le hub instance I a été créer pour être honnête, était probablement une mauvaise décision. Je vois maintenant à partir de votre première question, la seule façon d'y parvenir serait d'avoir le client d'envoyer leurs connectionid avec la mise à jour. J'ai édité la question avec mon client page web code. Comment puis-je envoyer cette connectionid de cette façon?
- dans le cas de votre exemple de code, vous n'auriez pas à envoyer l'id du tout, puisque vous pouvez utiliser les Clients.L'appelant; vous avez besoin de clarifier la séquence désirée des événements qu'il n'est pas clair ce que vos exigences sont
- comment voulez-vous dire que je pouvais utiliser des clients.l'appelant?
Vous devez vous connecter pour publier un commentaire.
Taylor réponse œuvres, cependant, il ne prend pas en considération une situation où un utilisateur a plusieurs onglets du navigateur web ouvert et, par conséquent, plusieurs différents Id de connexion.
Pour corriger cela, j'ai créé un Simultanées Dictionnaire dont les clés du dictionnaire est un nom d'utilisateur et la valeur de chaque clé est une Liste des connexions en cours pour l'utilisateur.
Connectés - Ajout d'une connexion dans le cache global dictionnaire:
Sur la déconnexion (fermeture de l'onglet) - Suppression d'un lien entre le cache global dictionnaire:
Lorsqu'un client appelle une fonction du côté serveur, vous pouvez récupérer leur ID de connexion via
Context.ConnectionId
. Maintenant, si vous souhaitez accéder que de l'Id de connexion par l'intermédiaire d'un mécanisme à l'extérieur d'un hub, vous pouvez:public static ConcurrentDictionary<string, MyUserType>...
par l'ajout au dictionnaire enOnConnected
et la suppression deOnDisconnected
. Une fois que vous avez votre liste d'utilisateurs, vous pouvez ensuite requête par l'intermédiaire de votre mécanisme externe.Ex 1:
Ex 2:
Espérons que cette aide!
Je prie de différer sur la reconnexion. Le client reste dans la liste, mais la connectid va changer. - Je faire une mise à jour de la liste statique sur se reconnecte à résoudre ce problème.