Mise en correspondance des connexions Signalesavec les utilisateurs

envisagez une application Web comme facebook, qui peut envoyer des notifications en temps réel aux utilisateurs.

Quelle est la meilleure façon, en utilisant asp.net signal!--4-->, pour garder une trace des identifiants de connexion qui appartiennent à quel utilisateur, même si l'utilisateur se déconnecte, ou se reconnecte plus tard ?

25
demandé sur Daniel Hursan 2012-12-25 22:17:05

4 réponses

consultez le blog suivant:

cartographie ASP.NET connexions SignalR aux utilisateurs de L'Application réelle

brièvement, vous ajouteriez les ID de connexion à l'utilisateur sur le OnConnected méthode et supprimer cette connexion sur l' OnDisconnected méthode. Gardez à l'esprit qu'un utilisateur de l'application peut avoir plusieurs connexions. Ainsi, vous devez avoir une à plusieurs relations entre votre Utilisateur et les identifiants de connexion. Le lien ci-dessus l'explique en détail avec un échantillon.

26
répondu tugberk 2013-01-01 21:28:16

j'ai fait ça pour une application interne. Quand un utilisateur se connecte, le serveur demande à l'utilisateur de s'enregistrer. De cette façon, je sais que non seulement un utilisateur est connecté et leur connnectionID signalR, mais ils peuvent également me dire toute autre information (comme le nom d'utilisateur ou autre).

quand ils se reconnectent, je leur demande de recommencer.

SignalR maintiendra le même connectionID par client même s'ils se reconnectent ce qui est bien. Reconnexion n'est pas la même que la connexion initiale. De nouvelles connexions indiquer un nouveau client, mais une reconnexion est sur le même client.

dans mon application j'ai maintenu un dictionnaire threadsafe séparé que j'ai gardé la trace de quel utilisateur et quel connectionID faisait quoi. De cette façon, je peux dire "Oh, envoyer un message à L'utilisateur ABC" et chercher leur code de connexion. Alors agissez sur l'objet client du Hub en signalR pour ce connectid. Si vous le faites de cette façon, vous pouvez même avoir le même "utilisateur" dans plusieurs connexion. Imaginez que l'utilisateur "abc" est ouvert dans deux onglets de navigateur. Si vous utilisiez strictement connectionID, ils seraient techniquement deux utilisateurs différents. Mais, en maintenant une sorte de collection locale regroupant les utilisateurs et les connexions, vous pouvez maintenant avoir plusieurs connexions pour le même utilisateur.

je devrais mentionner que si vous le faites de cette façon, vous devriez vous assurer que votre site gère ce qui se passe quand il redémarre et perd toutes les informations de connexion. Pour moi, quand quelqu'un se reconnecte je leur demande à nouveau ré-identifier. De cette façon, je peux reconstruire mon dictionnaire local quand le serveur est en ligne sans souci. Il a plus de frais généraux parce que maintenant vous demandez à tous vos clients de vous envoyer des informations, mais selon votre cas d'utilisateur cela pourrait être décalé ou groupé ou autrement distribué pour vous aider à gérer la charge.

En général, cependant, vous obtenez des informations (que ce soit en demandant à l'utilisateur d'approvisionnement), ou en contexte http info de session, vous devez suivre m'.

6
répondu devshorts 2013-01-02 19:45:24

Eh bien j'ai utilisé une approche différente, j'ai étendu la classe ApplicationUser comme ça:

    // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
    //public int ApplicationUserId { get; set; }
    //public string Name { get; set; }
    //public string Address { get; set; }
    //public string City { get; set; }
    //public string State { get; set; }
    //public string Zip { get; set; }
    [Required]
    public string Email { get; set; }
    [Required]
    public override string UserName { get; set; }
    [NotMapped]
    public string ConnectionId { get; set; }
    [NotMapped]
    public string ChattingUserConnectionId { get; set; }
    //public string HomeTown { get; set; }
    //public DateTime? BirthDate { get; set; }
}

Et dans mon hub je suis en train de faire quelque chose comme ça:

public class ChatHub : Hub
{
    #region Data Members
    private static ApplicationDbContext applicationDbContext = new ApplicationDbContext();
    private static UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(applicationDbContext));
    private static List<ApplicationUser> connectedUsers = new List<ApplicationUser>();

et quand un utilisateur se connecte au chat, j'obtiens son objet ApplicationUser par son nom d'utilisateur et je l'ajoute à la liste connectedUsers. Quand il se déconnecte, Je l'enlève.

j'ai rencontré quelques exceptions aléatoires avec des États EF et tels qui m'ont fait créer L'ApplicationDbContext et UserManager à chaque fois il est accessible au lieu de le placer à un objet statique:

 private ApplicationUser GetCurrentUser()
    {
        ApplicationDbContext applicationDbContext = new ApplicationDbContext();
        UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(applicationDbContext));
        var userName = Context.User.Identity.GetUserName();
        var user = userManager.FindByName<ApplicationUser>(userName);

        return user;
    }

Edit:

le hub code a quelques problèmes pour charger les objets enfant de l'utilisateur. Ce code, qui est également utilisé dans asp.net le modèle fonctionnera mieux, ApplicationDBContext n'est pas nécessaire:

    private ApplicationUserManager _userManager
    {
        get
        {
            return HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
    }


    var user = _userManager.FindByName<ApplicationUser, string>(userName);
3
répondu Ronen Festinger 2015-02-01 23:54:05

Cartographie SignalR des Utilisateurs pour les Connexions

chaque client se connectant à un hub passe un identifiant de connexion unique. Vous pouvez récupérer cette valeur dans le Contexte.Propriété ConnectionId du moyeu cadre. Si votre application doit associer un utilisateur à l'id de connexion et de persister que la cartographie, vous pouvez utiliser l'un des suivantes:

  • l'IDENTIFIANT de L'Utilisateur (Fournisseur de SignalR 2)
  • stockage En mémoire, comme un dictionnaire
  • groupe SignalR pour chaque utilisateur

stockage Permanent, externe, tel qu'une table de base de données ou une table Azure stockage chacune de ces implémentations est montrée dans cette rubrique. Vous utilisez les méthodes Onconnectées, Ondisconnectées, et OnReconnected du Hub classe pour suivre la connexion de l'utilisateur statut.



L'Identifiant De Fournisseur

si vous utilisez ASP.NET ' s standard membership provider ( IPrincipal.Identity.Name) Vous pouvez simplement faire ce qui suit pour accéder à un client basé sur un compte d'utilisateur. Si vous avez votre propre système de l'utilisateur vous pouvez créer votre propre fournisseur.

public class MyHub : Hub
{
    public void Send(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}
0
répondu Simon_Weaver 2015-05-31 08:46:44