Comment puis-je compter le nombre d'utilisateurs qui sont en train de voir une certaine page asp.net et non pas le website en general? Je veux compter les sessions anonymes et les sessions utilisateurs connectes.
Comment puis-je compter le nombre d'utilisateurs qui sont en train de voir une certaine page asp.net et non pas le website en general? Je veux compter les sessions anonymes et les sessions utilisateurs connectes.
A priori il suffirait d'incrémenter un champ statique dans le Page_Load, et le décrémenter dans le Page_Unload...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Public Shared currentUsers As Integer = 0 Private Sub Page_Load(sender As Object, e As EventArgs) currentUsers += 1 End Sub Private Sub Page_Unload(sender As Object, e As EventArgs) currentUsers -= 1 End Sub
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Merci bcp. Mais dans mon cas , je suis en train de compter le nombre d'utilisateurs qui sont en train de voir un hotel ( cad la page est : viewhotel?hotelID=xxx). Donc pour chaque hotel, j'ai une page asp.net.
Comment puis-je les compter ?
dans ce cas tu peux utiliser un dictionnaire, pour associer à chaque hotel le nombre de visiteurs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Public Shared currentUsers As New Dictionary(Of Integer, Integer) Private Sub Page_Load(sender As Object, e As EventArgs) If currentUsers.ContainsKey(hotelID) Then currentUsers(hotelID) += 1 Else currentUsers(hotelID) = 1 End If End Sub Private Sub Page_Unload(sender As Object, e As EventArgs) If currentUsers.ContainsKey(hotelID) Then currentUsers(hotelID) -= 1 End If End Sub
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Merci beaucoup tomlev.
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
En théorie ça ne devrait pas fonctionner, il faut passer par les sessions car les pages ne gardent pas l'état (State).
De plus, le page unload ne devrait pas fonctionner (ça fonctionnerait en Winforms mais pas en asp vu que les états des pages sont perdus juste après le rendu).
Bref, il faut :Unload : Unload is called after the page has been fully rendered, sent to the client, and is ready to be discarded. At this point, page properties such as Response and Request are unloaded and any cleanup is performed.
- Travailler avec une variable stockée dans Application() (pour le stockage des compteurs associés aux hotels, on pourrait aussi gérer ça en BD mais travailler avec des objets en mémoire est beaucoup plus rapide) et Session() unload (pour la MAJ des compteurs lorsque l'utilisateur n'est plus considéré comme "sur le site") et le Load des pages (pour que le compteur associé au dernier hotel vu soit décrémenté si on l'avait vu précédemment, un simple If sur une variable session qui contient l'ID de l'hotel de la dernière page vue peut faire ça).
Après faut l'implémenter c'est sûr, mais c'est tout à fait faisable, quoique ma méthode ne soit peut être pas optimale (car à chaque page vue elle nécessite un appel d'une méthode qui met à jour les compteurs au besoin, et que si l'utilisateur n'est plus actif depuis quelques minutes (donc n'est peut être plus vraiment "sur la page", c'est à dire l'état avant le session unload) l'info stockée n'est pas véridique à 100% (ce détail peut être gênant si la session a un timeout qui n'est pas celui par défaut (>1h par exemple) mais dans la plupart des cas cela ne gène pas)).
C'est pour ça que je déclare currentUsers en Shared... la classe n'étant pas déchargée, les champs statiques sont conservés. Par contre tu as sans doute raison sur le Unload... il vaut effectivement mieux décrémenter le compteur de l'hotel précédent dans le Load de la page suivante
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Personnellement je ne l'ai pas testé pour l'instant, j'ai trouvé cette information :
http://www.velocityreviews.com/forum...in-aspnet.html> 1. Does class shared variable share same feathers as ASP.NET application
> variable?
> Ans. NO. class shared variables are lost once the request is being
> processed and page is sent back to client. But application variables are
> stored on the server.
Bref le shared ne serait pas selon cette personne vraiment mémorisé jusqu'à la fin... mais je crois avoir vu des exemples inverse donc ce n'est pas assuré à 100%.
Personnellement dans le monde du web et de "l'oubli d'état" je n'utilise que :
1. Application("maVariable")
2. Session("maVariable")
3. Et l'autre objet dont j'ai oublié le mot et qui permet de stocker physiquement sur une page ASP.Net des informations temporaires (que l'utilisateur pourrait décoder en regardant le code html)
Bref pour moi : Shared = Winforms, et je ne l'utiliserai pas dans une application web pour éviter la confusion ou des erreurs potentielles.
Il faudrait que je teste avec Shared pour confirmer la non-validité de la chose mais là je n'ai pas VSD sur ce poste alors... ça sera pour une autre fois.
Ca me surprend un peu quand même... ça voudrait dire que la classe est déchargée de l'AppDomain après le traitement de la requête ?! Pas génial en termes de perfs... Mais effectivement c'est sans doute moins fiable que Server["variable"], parce que la classe pourrait être déchargée si elle n'est pas utilisée pendant un certain temps (mais je doute qu'elle soit systématiquement déchargée après chaque requête)
Le ViewState peut-être ?
Shared n'est absolument pas lié à WinForms, c'est un concept de POO. C'est comme ça qu'on déclare en VB.NET un membre statique. Ca peut être utilisé dans n'importe quel type d'application (y compris dans un appli web, à condition d'être conscient des "risques" que ça implique).
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Partager