Мы видим очень странную проблему с приложением ASP.NET, которое недавно было обновлено до NHibernate 3.10GA, Castle 2.5.2 и с использованием Castle.Facilities.NHibernateIntegration.Мы используем ISessionManager из NHibernateIntegration с компонентом Web.SessionWebModule для управления нашим циклом ответа на запрос, и для него настроено значение isWeb = true.
Наше приложение возвращает страницу для параметра, закодированного в URL, и эта страница также впоследствииделает некоторые вызовы веб-службы.
Проблема возникает очень периодически и проявляется как NHibernate.LazyInitializationException - Не удалось инициализировать прокси-сервер - нет ошибки сеанса, вызванной отложенной загрузкой многие-к-одномуОтношения с основным объектом.Это может означать, что объект сеанса теряется в цикле запрос-ответ для страницы.
Мы решили отладить методы OnBeginRequest и OnEndRequest в Castle.Facilities.NHibernation и добавили несколько операторов отладки для идентификациинить.Мы обнаружили следующее:
В тех случаях, когда возникает ошибка, threadId в OnBeginRequest не соответствует threadId в OnEndRequest;и далее кажется, что исходный поток используется для других запросов и ответов.Когда исходный запрос страницы наконец возвращается, его threadid не совпадает с исходным threadid, в котором он был запущен. Кто-нибудь видел что-нибудь подобное?
Вот данные отладки.Обратите внимание, что [9] указывает исходящий поток согласно log4net
[9] DEBUG SessionWebModule - On begin request thread id: 9 for MyPage.aspx
[9] DEBUG SessionWebModule - On begin request thread id: 9 for example.ashx
[9] DEBUG SessionWebModule - On end request thread id: 9 example.ashx
[9] DEBUG SessionWebModule - On begin request thread id: 9 for WebService.asmx/js
[9] DEBUG SessionWebModule - On end request thread id: 9 for WebService.asmx/js
[6] ERROR NHibernate.LazyInitializationException - [error message describing relationship] -Could not initialize proxy - no Session.
[6] DEBUG SessionWebModule - On end request thread id: 9 for MyPage.aspx
Обратите внимание на первую и последнюю строку, показывающие, что запрос страницы возник в потоке 9, но вернулся в потоке 6.