Je viens de découvrir que chaque requête dans une application web ASP.Net obtient un verrou de session au début de la requête, puis le libère à la fin de la requête !
Au cas où vous n'auriez pas compris, comme je l'ai fait au début, cela signifie essentiellement ce qui suit :
-
Chaque fois qu'une page Web ASP.Net met beaucoup de temps à se charger (peut-être en raison d'un appel lent à la base de données ou autre), et que l'utilisateur décide de naviguer vers une autre page parce qu'il est fatigué d'attendre, il ne le peut pas ! Le verrouillage de session ASP.Net oblige la nouvelle demande de page à attendre que la demande originale ait terminé son chargement péniblement lent. Arrrgh.
-
Chaque fois qu'un UpdatePanel se charge lentement, et que l'utilisateur décide de naviguer vers une autre page avant que l'UpdatePanel ait fini de se mettre à jour... IL NE PEUT PAS ! Le verrouillage de session ASP.net oblige la nouvelle demande de page à attendre que la demande originale ait terminé son chargement douloureusement lent. Double Arrrgh !
Quelles sont les options ? Jusqu'à présent, j'ai trouvé :
- Implémentez un SessionStateDataStore personnalisé, que ASP.Net prend en charge. Je n'en ai pas trouvé beaucoup à copier, et cela semble plutôt risqué et facile à gâcher.
- Gardez la trace de toutes les demandes en cours, et si une demande arrive du même utilisateur, annulez la demande initiale. Cela semble un peu extrême, mais cela pourrait fonctionner (je pense).
- N'utilisez pas la Session ! Lorsque j'ai besoin d'une sorte d'état pour l'utilisateur, je pourrais simplement utiliser Cache à la place, et les éléments clés sur le nom d'utilisateur authentifié, ou quelque chose comme ça. Encore une fois, cela semble un peu extrême.
Je ne peux vraiment pas croire que l'équipe ASP.Net de Microsoft ait laissé un tel goulot d'étranglement dans le cadre de travail à la version 4.0 ! Est-ce que j'ai raté quelque chose d'évident ? Serait-il difficile d'utiliser une collection ThreadSafe pour la session ?
41 votes
Vous réalisez que ce site est construit à partir de .NET. Cela dit, je pense qu'il s'adapte très bien.
7 votes
OK, j'étais un peu facétieux avec mon titre. Néanmoins, l'effondrement des performances qu'impose l'implémentation immédiate de session est surprenant. De plus, je parie que les gars de Stack Overflow ont dû faire un bon bout de travail de développement hautement personnalisé pour obtenir les performances et l'extensibilité qu'ils ont obtenues - et bravo à eux. Enfin, Stack Overflow est une application MVC, et non WebForms, ce qui, je le parie, aide (même s'il faut admettre qu'ils utilisent toujours la même infrastructure de session).
4 votes
Article sur ce sujet dans une perspective MVC
4 votes
Si Joel Mueller vous a donné les informations nécessaires pour résoudre votre problème, pourquoi n'avez-vous pas marqué sa réponse comme étant la bonne ? C'est juste une idée.
1 votes
@ars265 - Joel Muller a fourni beaucoup de bonnes informations, et je tenais à l'en remercier. Cependant, j'ai finalement choisi une autre voie que celle suggérée dans son message. D'où le fait de marquer un autre message comme étant la réponse.
0 votes
Avez-vous vérifié si votre site démarre plus vite sans https ? Si c'est le cas, essayez la solution proposée dans cet article de MCS : blogs.msdn.microsoft.com/mcsuksoldev/2011/01/19/
1 votes
Comment avez-vous compris que votre session est verrouillée ? Est-il possible de comprendre par programme que la session est verrouillée ?