2008-12-01 3 views
2

J'utilise NHibernate sur un nouveau projet ASP.NET et je rencontre un comportement que je considère comme étrange. J'essaie de gérer ma session en utilisant un HttpModule pour attraper l'événement EndRequest et fermer la session. Cela fonctionne correctement, cependant, après que l'événement EndRequest se déclenche, j'obtiens une exception dans l'événement OnLoad d'un de mes contrôles personnalisés qui tente de lire une propriété de mon objet chargé paresseux. Je reçois une exception indiquant «Impossible d'initialiser paresseusement une collection, aucune session ou session n'a été fermée». Désactiver la charge paresseuse pour ces propriétés résout le problème et constitue une solution acceptable. Mais cela semble aller à l'encontre de ce que j'ai toujours pensé être vrai.Utilisation de l'événement EndRequest pour fermer la session NHibernate avec IIS 7

Je suppose que l'événement OnLoad et tout le traitement côté serveur seront effectués au moment où EndRequest est déclenché. C'est aussi la première fois que j'ai utilisé IIS 7 sur un projet. Est-ce une raison pour le comportement? Quel est le comportement attendu?

+0

Vous pouvez consulter cet article pour plus d'informations sur l'utilisation de NHibernate avec un module HTTP. –

+0

http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx –

Répondre

2

Je viens d'avoir un moment de «paume de la main». Malgré le fait que je suis en train de déployer sur un serveur IIS 7, j'ai débogué en utilisant le serveur Web intégré VS 2008 (Casini). Casini transmet toutes les demandes via le pipeline ASP.NET, mais pas IIS. Cela provoquait une demande pour un fichier image ou un fichier javascript (ou toute autre ressource statique) pour fermer ma session NHibernate avant que je pensais réellement qu'il devrait fermer.

Merci pour la liste des ressources, je vais certainement les examiner.

+0

Soooo ... comment avez-vous réparé alors? Obtenir la même erreur. – rball

+0

moi aussi .. transfert de iis 6 à iis 7 causé problème simulaire pour moi –

+0

a trouvé mon problème. J'avais besoin d'ajouter un httpModule dans le webconfig. En utilisant IIS6 et le cassini construit ce wasent nécessaire. –

1
  1. Si votre objet est lazy-init et qu'aucune session n'est ouverte, la résolution des propriétés échouera. N'oubliez pas que les exceptions paresseuses apparaîtront très probablement lorsque vous avez une relation avec une autre entité qui n'a pas été initialisée.

http://forum.springframework.org/showthread.php?t=13474

Je recommande également d'utiliser quelque chose comme le module HTTP Rhino Commons pour gérer vos sessions NHibernate.

0

Utilisez HttpModule si vous avez besoin d'un chargement différé. Hérité de votre classe et vous auriez deux méthodes que vous pouvez remplacer (je ne me souviens pas de leurs noms). Le premier est appelé chaque fois qu'une page est demandée. Ouvrez la session et placez la session dans viewstate. L'autre méthode est appelée lorsque la page est postée, fermez votre session là-bas.

1

Vous devez utiliser un emballage thermorétractable pour gérer cela. J'aime utiliser Autofac avec intégration ASP.NET/MVC. Vous demandez simplement le RequestContainer pour un ISession quand vous en avez besoin et, parce que le ISession est IDisposable, le RequestContainer sait automatiquement se débarrasser du ISession lorsque la demande actuelle se termine. Tout est pris en charge pour vous.