web-dev-qa-db-fra.com

Demandes en attente sur le module Session sur IIS 7.5

De temps en temps, certaines demandes sur mon site Web commencent à se bloquer sur l'état RequestAcquireState du module Session. Lorsque cette spirale commence, toutes les demandes ont expiré et nous devons redémarrer le IIS sur le serveur concerné.

J'ai beaucoup étudié la question et la seule conclusion à laquelle je suis parvenue est qu'un blocage a eu lieu pendant que l'application tente d'accéder aux données utilisateur stockées dans Session.

La seule option à laquelle je puisse penser pour résoudre ce problème consiste à réduire ou à cesser d'utiliser des sessions dans mon application. Cela fait définitivement partie du plan, mais cela prendra un certain temps avant que nous puissions terminer.

Nous utilisons 6 machines avec IIS 7.5, sans affinités proc StateServer et server dans notre répartition de charge.

Des astuces sur la manière de résoudre ce problème ou de le résoudre sans avoir à supprimer complètement les sessions?

IIS Hanging Processes

18
tucaz

Le mécanisme de verrouillage existe à la fois sur le fournisseur et sur le module de session (IIS Session Module). Vous pouvez développer un module de session personnalisé, mais vous avez toujours besoin d'un fournisseur sans verrouillage ou Vous pouvez développer un fournisseur personnalisé sans verrouillage, mais vous avez toujours besoin du module de session IIS et l'implémentation à ce niveau n'est pas si simple.

La solution est UnlockedStateProvider [aka Débloqué]

Suivez le lapin blanc: P (Vérifiez le projet de démonstration, il explique tout.)

6
efaruk

La réponse est Hotfix Rollup 2828841 pour .NET Framework 4.5, voici toutes les explications:

http://forums.asp.net/t/1888889.aspx/2/10?Question+regarding+a+possible+bug+within+NET+4+5

et ici le lien de téléchargement

Cela fonctionne pour moi sur IIS 7.5 Windows Server 2008 rs x64, application de formulaires Web asp.net avec beaucoup de demandes ajax.

5
RolandoCC

Je viens de découvrir aujourd'hui que si vous avez une longue requête (ou dans mon cas une boucle infinie), toutes les requêtes suivantes seront verrouillées, car par défaut, ASP.NET se verrouille en session.  

Donc, si vous avez des utilisateurs avec des requêtes dans RequestAcquireState, vérifiez s'il existe une requête dans ExecuteRequestHandler qui verrouille la session et empêche ainsi le démarrage d'autres requêtes.

Il y a une discussion ici sur la façon d'empêcher le verrouillage en session. (Fondamentalement, créez la plupart de vos pages en tant que session en lecture seule et modifiez la session aussi rarement que vous le pouvez.)

4
jaraics

Est-il possible que ces utilisateurs aient une autre requête de longue durée et les requêtes que vous voyez s'accumuler sont en réalité des requêtes secondaires? Par défaut, ASP.NET verrouille la session jusqu'à ce qu'une demande soit complète. Si une deuxième demande arrive avant la fin de la première, il faudra attendre. Si vous utilisez MVC, vous pouvez modifier ce comportement en ajoutant un attribut à votre contrôleur. 

[SessionState (SessionStateBehavior.ReadOnly)]

Cela rend la session en lecture seule, supprimant le comportement de verrouillage permettant le traitement des demandes ultérieures. 

0
ctsears