Мне удалось ее решить.
Изучив исходный код SharpArch.Wcf, я обнаружил, что перед отправкой ответа службы WCF он всегда закрывает все сеансы NHibernate. Это само по себе хорошо.
Кроме того, я обнаружил, что мои клиентские прокси-фабрики запускались только один раз за веб-запрос, а второй вызов службы должен вызывать новый экземпляр прокси. В результате второй вызов службы завершился ошибкой, поскольку основной сеанс NHibernate уже был закрыт. Я решил это, украсив прокси-классы своего клиента с помощью Castle.Core.TransientAttribute , который оставляет управление временем жизни до фабрики, которая создает клиента. В результате наши прокси-фабрики вызываются каждый раз, когда запрашивается прокси.
Во-вторых, мне пришлось зарегистрировать прокси-серверы следующим образом (в классе ComponentRegistrar ):
container.AddFacility("WcfSessionFacility", new WcfSessionFacility());
container.Kernel.AddComponentWithExtendedProperties(
"AccountService",
typeof(IAccountService),
typeof(AccountServiceClient),
new Dictionary<string, object>()
{
{ WcfSessionFacility.ManageWcfSessionsKey, true }
});
WcfSessionFacility управляет закрытием / прерыванием клиента в зависимости от его состояния. Это гарантирует, что клиентский канал будет закрыт всякий раз, когда клиентский прокси уничтожен, поэтому нам не нужно помещать наши вызовы в блоки try-catch.
Как и я, вы могли бы подумать о настройке управления временем жизни при добавлении компонента вместо использования атрибута, но, очевидно, нет подходящей перегрузки AddComponentWithExtendedProperties , которая позволяет это.