12
votes

C # ASP.NET MVC: Quand mettre à jour LastAlactivityDate?

J'utilise ASP.NET MVC et crée un site Web public. Je dois garder une trace des utilisateurs en ligne. Je vois que la manière standard dans ASP.NET de faire cela est de garder une trace de lastAlactivityDate . Ma question est quand devrais-je mettre à jour cela?

Si je le mettais à la mise à jour chaque fois que les utilisateurs cliquent quelque part, je ressentirai une performance en arrière. Toutefois, si je ne fais pas cela, les personnes qui surfent seulement seront répertoriées comme hors ligne.

Quelle est la meilleure façon de le faire dans ASP.NET MVC?


2 commentaires

Est-ce que quelqu'un sait comment Facebook cela?


Je suppose que Facebook fait constamment de vérifier cela dans l'un de ses nombreux appels AJAX


10 Réponses :


0
votes

Une bonne question, j'ai réfléchi à cela aussi et à quel point ces mécanismes peuvent préciser la performance, quelques idées:

1) Suivez la dernière date de connexion

2) Utilisez la longlogindate + la longueur de la session attendue pour définir une sorte de typeNEnlineDate pouvant être utilisé pour vérifier si l'utilisateur est en ligne.


2 commentaires

Mais que se passe-t-il si un utilisateur signe dedans pendant 3 heures et la longueur de la session est-elle de 20 minutes? Ensuite, l'utilisateur sera répertorié comme hors connexion incorrectement. Qui arriverait dans la plupart des cas?


Vous pouvez stocker cette dernière ligne en session et définir un drapeau pour la mettre à jour en fonction d'une action d'utilisateur (charge de page)



2
votes

Pourquoi ne pas mettre en œuvre la mise à jour à la litisifDate comme un appel asynchrone? De cette façon, vous pouvez déclencher la mise à jour et poursuivre le traitement.


2 commentaires

Y a-t-il un événement dans le global.aSax qui attrapera peut-être ces asynchronisation?


Application_BeGinRequest est appelé dans le global.aSax. Vous pouvez utiliser théoriquement ce point d'entrée pour enregistrer la date de l'utilisateur.



1
votes

Si vous utilisez InproC SESSIONState, utilisez le SessionStemodule.end événement. Cela se produit lorsque l'état de la session est expulsé du stockage de cache sous-jacent. Typiquement, cela se produit après 20 minutes d'inactivité, vous pouvez définir l'heure dans web.config.


1 commentaires

Cet événement ne semble pas se tirer correctement pour moi.



0
votes

Je ne pense pas qu'il y ait une grande pénalité dans la performance si vous récupérez l'utilisateur connecté actuel sur chaque requête et mettez à jour le champ LastAltactivityDate à chaque fois (si vous avez des soins et invoquez le GetUserer méthode pour l'utilisateur connecté une fois par demande http). De cette façon, vous pouvez également vous assurer de toujours avoir les données de l'utilisateur frais, telles que le courrier électronique, le nom, etc. au cas où il / elle met à jour ces données.


2 commentaires

En tenant compte de ce lastAlactivityDate dans une table séparée qui inclut uniquement l'ID utilisateur | LastAlactivityDate réduirait des frais généraux?


@Mark - Cela viennerait sûrement d'ajouter une jointure inutile



6
votes

Il suffit de mettre un appel JavaScript Ajax au bas de votre page maître pour suivre ceci.

Ne vous inquiétez pas pour la performance pour le moment. Si elle est mise en œuvre et que vous voyez que c'est un problème, revenez à trouver une meilleure solution. Quelque chose de si simple ne devrait pas être un problème de performance.

Pensez simplement à cela comme Google Analytics. Il repose au fond des millions de pages avec peu d'impact sur les expériences de l'utilisateur de ces sites.


2 commentaires

Grand conseil. Fini par faire ça :)


@ user594166: je mets le code à l'intérieur $ (document) .Ready ... Voir ici Stackoverflow.com/ A / 12720372/114029 .



2
votes

Comme @jab dit, il suffit de le mettre en œuvre et si vous le voyez comme une question de performance dans le futur - traitez-le alors.

C'est comme ça que je l'ai fait dans mon application: P>

protected void Application_EndRequest()
{
    if ((Response.ContentType == "text/html") && (Request.IsAuthenticated))
    {
        var webUser = Context.User as WebUser;
        if (webUser != null)
        {
            //Update their last activity
            webUser.LastActivity = DateTime.UtcNow;

            //Update their page hit counter
            webUser.ActivityCounter += 1;

            //Save them
            var webUserRepo = Kernel.Get<IWebUserRepository>(); //Ninject
            webUserRepo.Update(webUser);
        }
    }
}


0 commentaires

2
votes

Je l'ai mis dans une file d'attente spéciale qui n'autorise qu'une partie d'une clé donnée dans la file d'attente (et utiliser l'ID utilisateur comme clé dans ce cas). Ensuite, j'ai un fil de priorité faible qui fonctionne à travers cette file d'attente faisant des mises à jour de la base de données. Ainsi, aucune ralentissement de l'utilisateur, et un utilisateur faisant 100 mises à jour en une seconde ne causer aucun préjudice. Si cela devient un problème, je prendrai ces mises à jour dans les mises à jour par lots contre la base de données, mais pour l'instant, cette approche fonctionne tout simplement bien.

Si l'application s'est écrasée, je perdrais quelques secondes de dernière donnée d'activité, mais cela va bien. Bien sûr, je mettez également à jour l'objet utilisateur en mémoire à chaque fois de manière à ce que cela soit reflété dans l'interface utilisateur, même si cela ne s'est pas encore dirigé vers la base de données. Typiquement, il est là avant d'avoir reçu la page complète quand même.


0 commentaires

6
votes

Il suffit de courir dans le même problème, voici ma réponse pour les utilisateurs de MVC:

L'idée est de déclencher des membres.Gettuser ("..", true) pour chaque charge de page. Cela mettra automatiquement à jour le lastAlactivityDate.

Je l'ai mis dans mon global.asax sous "registerglobalfilters": xxx

J'ai créé une nouvelle classe qui ressemble à Ceci: xxx


1 commentaires

Merci pour cela. J'aime cette approche.



4
votes

J'ai commencé à utiliser le SimpleMembershipProvider . C'est tellement simple qu'il n'y a plus de lastAlactivityDate suivi. Donc, je devais rouler le mien.

Je viens d'ajouter une colonne de dans la table des utilisateurs et était bon d'aller ...

suivant Conseil de JAB et à l'aide de la page _layout.cshtml (page maître) dans une application ASP.NET MVC, j'ai fait cela Avec l'aide de jQuery: xxx

voici la méthode d'action: xxx

seulement 133 ms (YMMV): -) < / p>

Entrez la description de l'image ici


0 commentaires

0
votes

J'ai essayé Charlino S dans le global.asax comme celui-ci xxx

Cependant, je recevais la requête .AuThentifié false tout le temps. Donc j'ai déplacé le code sur une méthode dans mon page.master comme ceci xxx

i appelez la méthode à partir de la page Master < / code> page_load événement et là-bas, il a fonctionné.

J'utilise ASP.NET Identity Non Mais J'ai ajouté une classe hériter de la classe identitryUser Classe et dans l'appuseur Classe I Ajoutée LastAltactivity Propriété .

Ceci est dans une application WebFormes non mvc .


0 commentaires