2012-11-23 4 views
0

J'utilise une pile MVC4, C#, Castle Windsor, fluentnhibernate pour mon application web, ce qui fonctionne généralement très bien.Fermeture inattendue de la session NHibernate

Son seul de temps en temps que je reçois une erreur liée à NHibernate quelque chose le long des lignes de:

tentative non valide d'appeler Lire lorsque le lecteur est fermé.

ou

connexion interne erreur fatale.

Cela provoque généralement sa tête laide lorsque je fais plusieurs appels, dans une succession très proche.

Actuellement, je le réplique en effectuant plusieurs ajax gets, à partir de JQuery.

Ce que je soupçonne être le problème, c'est avec ma gestion de session NHibernate.

La seule chose que je peux penser est que les appels sont une personne qui utilise le même session, la première complète et ferme, puis l'appel suivant ne parvient pas à remplir.

Cela ne devrait pas être possible en raison de la façon dont mes sessions sont traitées comme ceci:

Kernel.Register(
       Component.For<ISessionFactory>() 
           .UsingFactoryMethod(_ => config.BuildSessionFactory()), 
       Component.For<ISession>() 
           .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()) 
           .LifestylePerWebRequest()); 

devrait être une séance par demande non?

Comment sinon, ou où d'autre puis-je rechercher le problème? Je suis assez coincé.

Répondre

0

Bien sûr, cela a été résolu quelques minutes plus tard, mais la réponse a été une révélation pour moi.

This answer m'a conduit sur le bon chemin.

Alors que tous mes dépôts, gestionnaires et autres couches ont été installés avec le bon style de vie en utilisant Castle Windsor, il y en avait un qui ne l'était pas.

Je faisais un appel Repository à partir d'un ActionFilter, tous mes filtres d'action sont invoqués via une classe ActionInvoker qui a été enregistrée de manière incorrecte en tant que Singleton, ce qui a provoqué mes erreurs.

container.Register(Component.For<IActionInvoker>() 
            .ImplementedBy<WindsorActionInvoker>() 
            .LifeStyle.***Singleton***); 

doit bien sûr être

container.Register(Component.For<IActionInvoker>() 
            .ImplementedBy<WindsorActionInvoker>() 
            .LifeStyle.Transient); 

Juste un autre rappel à accorder plus d'attention à ces modes de vie.

Questions connexes