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 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. p>
Quelle est la meilleure façon de le faire dans ASP.NET MVC? P> lastAlactivityDate code>. Ma question est quand devrais-je mettre à jour cela? P>
10 Réponses :
Une bonne question, j'ai réfléchi à cela aussi et à quel point ces mécanismes peuvent préciser la performance, quelques idées: P>
1) Suivez la dernière date de connexion p>
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. P>
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)
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. p>
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.
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. P>
Cet événement ne semble pas se tirer correctement pour moi.
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 CODE> à chaque fois (si vous avez des soins et invoquez le
GetUserer code> 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. P>
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
Il suffit de mettre un appel JavaScript Ajax au bas de votre page maître pour suivre ceci. p>
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. P>
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. P>
Grand conseil. Fini par faire ça :)
@ user594166: je mets le code à l'intérieur $ (document) .Ready code> ... Voir ici Stackoverflow.com/ A / 12720372/114029 .
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); } } }
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. p>
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. P>
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. P>
Je l'ai mis dans mon global.asax sous "registerglobalfilters": p> J'ai créé une nouvelle classe qui ressemble à Ceci: p>
Merci pour cela. J'aime cette approche.
J'ai commencé à utiliser le SimpleMembershipProvider . C'est tellement simple qu'il n'y a plus de Je viens d'ajouter une colonne code> de code> dans la table des utilisateurs et était bon d'aller ... p> suivant Conseil de JAB et à l'aide de la page code> _layout.cshtml code> (page maître) dans une application ASP.NET MVC, j'ai fait cela Avec l'aide de jQuery: p> voici la méthode d'action: p> seulement 133 ms (YMMV): -) < / p> lastAlactivityDate code> suivi. Donc, je devais rouler le mien.
p> p> p>
J'ai essayé Charlino strong> S dans le global.asax comme celui-ci Cependant, je recevais la requête i appelez la méthode à partir de la page J'utilise Ceci est dans une application WebFormes code> non .AuThentifié code> false tout le temps.
Donc j'ai déplacé le code sur une méthode dans mon
page.master code> comme ceci p>
Master < / code>
page_load code> événement et là-bas, il a fonctionné. p>
ASP.NET Identity Code> Non Code> Mais J'ai ajouté une classe code> hériter de la classe
identitryUser code> Classe et dans l'appuseur code> Classe I Ajoutée
LastAltactivity Propriété code>. p>
mvc code>. p> p>
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