#asp.net #nhibernate #spring.net
#asp.net #nhibernate #spring.net
Вопрос:
Мы используем Spring.NET для внедрения зависимостей и NHibernate как ORM. Мы используем модель сеанса для каждого запроса, и сеанс создается с помощью Spring.NET . На одной из страниц есть вызов webservice . Когда вызов веб-службы вызывает исключение EndpointNotFoundException, сеанс NH закрывается, и мы получаем «Исключение отложенной инициализации»: не удалось лениво инициализировать коллекцию role: , ни один сеанс или сеанс не был закрыт (у нас есть объекты Person, которые загружаются при загрузке страницы, но объекты Person установилииз лениво загруженных коллекций, таких как адреса и т.д. ошибка выдается при обращении к одной из лениво загруженных коллекций). Если исключение не генерируется, все работает правильно. Есть ли быстрое решение?
Комментарии:
1. Почему сеанс NH закрывается из-за ошибки веб-службы?
2. 🙂 Это то, что я пытаюсь выяснить. Как только генерируется исключение, я получаю сообщение об ошибке «ни один сеанс или сеанс не был закрыт».
3. Быстрое решение — «Не запрашивать из представления» и загружать необходимые объекты, доступные в вашем db-layer. nhprof.com/learn/alerts/QueriesFromViews
4. Вам необходимо предоставить более подробную информацию о том, какие запросы вы пытаетесь выполнить и откуда вы вызываете веб-службу.
Ответ №1:
Требуется дополнительная информация, но я попытаюсь сделать расчетное предположение:
Генерируемое исключение не обрабатывается или, если обрабатывается, повторно генерируется. Исключение распространяется на обработчик ошибок страницы.
В любом случае где-то в конвейере пузырьков исключений вызывается обработчик ISession.Close()
исключений, а затем использует исключение (и, таким образом, выполнение программы продолжается посредством рендеринга страницы)
Это не редкость, и обычно при выполнении отката транзакции рекомендуется также закрыть ISession
.
Обратите внимание, что откат закрытие может быть выполнено при неудачной фиксации, и в этом случае неудачный вызов веб-службы каким-то образом загрязняет состояние вашего объекта, и, следовательно, фиксация завершается неудачно. Снова исключение обрабатывается и используется.
Существенная деталь заключается в том, что некоторый кодовый путь, который содержит проксируемые объекты nhibernate, все еще выполняется и пытается ссылаться на закрытый ISession