36 votes

SemaphoreFullException lors de la vérification du rôle de l'utilisateur via l'adhésion ASP.NET

J'ai une page qui vérifie qu'un utilisateur a un rôle particulier avant d'effectuer une certaine tâche. Je n'ai eu aucun problème de fonctionnalité et je n'ai apporté aucune modification évidente au code en question. Le site est sur ma machine de développement (Windows Vista) exécutant IIS 7.0 et la base de données est MS SQL 2005 sur un serveur séparé. Soudain, tous les appels à la base de données User.IsInRole se traduisent par

System.Threading.SemaphoreFullException : L'ajout du nombre spécifié au sémaphore lui ferait dépasser son nombre maximal.

Je suis sûr que le redémarrage d'IIS "résoudra" le problème, mais j'aimerais en comprendre la cause afin de m'assurer que cela ne se reproduira pas sur mon site de production.

Le haut de la trace de la pile est :

[SemaphoreFullException : L'ajout du nombre spécifié au sémaphore lui ferait dépasser son nombre maximal]. System.Threading.Semaphore.Release(Int32 releaseCount) +6065293 System.Data.ProviderBase.DbConnectionPool.PutNewObject(DbConnectionInternal obj) +57 System.Data.ProviderBase.DbConnectionPool.DeactivateObject(DbConnectionInternal obj) +338 System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject) +163 System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) +117 System.Data.SqlClient.SqlInternalConnection.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory) +37 System.Data.SqlClient.SqlConnection.Close() +158 System.Web.DataAccess.SqlConnectionHolder.Close() +25 System.Web.Security.SqlRoleProvider.GetRolesForUser(String username) +847 System.Web.Security.RolePrincipal.IsInRole(String role) +182

24voto

hagensoft Points 768

Ce problème a été résolu en redémarrant le serveur de développement ASP.NET dans la barre des tâches de Windows.

Ou en ajoutant définitivement 'Pooling=False;' à la chaîne de connexion devrait résoudre le problème.

11voto

O'Rooney Points 349

Je l'ai aussi de temps en temps.

Je pense que dans mon cas, cela s'est produit parce que j'ai arrêté le débogueur pendant l'exécution de la page, donc peut-être que le pool de connexion de la base de données a été perturbé.

Il y a un long fil de discussion à ce sujet ici : http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/b5b7a179-3737-4380-b6cf-843f3e71b317/

avec plusieurs utilisateurs rapportant la même chose. Il n'y a pas de conclusion définitive, Microsoft semble penser que nos applications ferment une poignée qu'elles ne devraient pas. Mais dans notre application, au moins, il n'y a pas d'appels CloseHandle.

S'il s'agissait d'un véritable bogue dans la mise en commun des connexions de la base de données, j'aurais pensé qu'il aurait été découvert depuis longtemps, car c'est ce qui fait fonctionner tous les sites Web asp.net...

11voto

Lukas Points 622

Je sais qu'il a été posté, mais voici comment je l'ai eu, et ce qui l'a résolu.

Ce que j'ai fait Placez un point d'arrêt près du segment de code qui effectue un appel SQL.

Ce qui l'a résolu Redémarrage du serveur de développement ASP.NET dans la barre d'état système de Windows (à côté de votre horloge dans le coin inférieur droit).

6voto

Pheonixblade9 Points 6136

Cela m'est arrivé lorsque j'ai inséré un point d'arrêt sur une ligne qui effectuait un appel SQL.

Placer le point d'arrêt à un moment ultérieur (pas à un appel SQL) a résolu le problème pour moi.

5voto

Mike Points 31

Le redémarrage de ASP.NET Cassini sur la barre des tâches de Windows a réglé le problème pour moi !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X