Сеанс NHibernate (сеанс для каждого запроса) Закрывается при возникновении исключения вызова WCF EndpointNotFoundException, как это исправить?

#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