Pas d'accès aux informations de session via SignalR Hub. Est-ce que mon design est faux?
Je viens de découvrir que vous ne pouvez pas accéder à la session en cours au sein de la SignalR Hub.
Simplifié mon scénario: j'ai essayé d'écrire un chat.
Le nom de l'utilisateur actuel a été maintenu au cours de la Session.
J'ai utilisé SignalR de mise à jour (un groupe de connexions) à propos de chaque nouveau message.
Maintenant je vois que je ne peux pas accéder le nom de l'utilisateur actuel à travers le moyeu.
Je pense qu'il y a peut-être des solutions de contournement, mais est-ce que mettre en œuvre ma conception était mal?
Devrais-je n'ai pas utilisé SignalR à cette fin? Ou devrais-je pas utiliser Session
de cette façon?
source d'informationauteur Letterman
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas utiliser de Session avec SignalR (voir SignalR ne pas utiliser de Session sur le serveur). Vous identifier les liens logiques par leur identifiant de connexion qui vous pouvez carte de noms d'utilisateurs.
Le problème sous-jacent est que l'accès à SessionState est sérialisé dans ASP.NET pour s'assurer de l'état de la cohérence, de sorte que chaque demande pour le hub pourrait bloquer les autres demandes. Dans le passé, limité l'accès en lecture seule (je suppose (mais ne peut pas le confirmer car l'essentiel n'est plus là) par la mise en EnableSessionstate lecture seulece qui empêche le verrouillage problème que j'ai décrit) est possible, mais soutien pour cela a été abandonnée. Voir aussi divers autres endroits où la SignalR équipe fait des déclarations similaires. Enfin: il y a une déclaration officielle de la documentation sur
HTTPContext.Current.Session
.Vous pouvez envoyer les valeurs du client vers le serveur concentrateur par le biais de la Chaîne de Requête.
Avant la
$.connection.hub.start()
méthode vous pouvez ajouter quelque chose comme ceci:Client Code JS:
Sur le côté serveur sur le Hub, vous pouvez l'utiliser dans une méthode:
Je n'ai pas tester avec les sessions, mais, bien sûr, sur le côté client, vous pourrait être aussi génial que vous le pouvez.
J'étais dans une situation où je ne pouvais pas utiliser l'Utilisateur/l'Identité, parce que la séance n'avait pas été authentifié donc j'ai simplement utilisé la réelle valeur du cookie de session.
Je suis sûr que quelqu'un va trouver quelque chose de mal avec cette solution, et si oui, n'hésitez pas à commenter parce que je voudrais un meilleur moyen d'atteindre les liant d'une session à un ensemble de clients à notifier.
La meilleure approche est d'utiliser de Cookie de session. car, comme mentionné ci-dessus , Vous ne pouvez pas utiliser la session . ainsi, Lorsque l'utilisateur de se connecter à votre système, mettre son identifiant unique(nom d'utilisateur) dans le cookie . ensuite, travailler avec cookie où vous voulez accéder à la session . ces ci-dessous...