ISession и IStatelessSession в одновременно в одном веб сервисе
Коллеги, помогите советом.
Есть WCF служба, для доступа к данным используется связка Fluent NHibernate + Castle Winsor.
Ситуация следующая, есть следующий кусок кода в репозитарии — источнике данных:
public class DataRepository : IDataRepository
{
public IList GetData()
{
ISessionManager sessionManager = WindsorContainer.Resolve(ISessionManager);
using (var stateLessSession = sessionManager.OpenStatelessSession())
{
var lload = stateLessSession.CreateSQLQuery("SELECT * FROM dbo.Data").List();
return lload;
}
}
}
Реализация метода веб службы обернута в транзакцю, с использованием Automatic Transaction Management Facility, т.е.:
Так как приложение использует в основном ISession и чтобы обеспечить закрытие сессией, чтобы избежать утечек памяти и соединений,
реализован механиз закрытия сессий, который перехватывает все запросы к вебслужбам и открывает сессии при началае обработки сообщений и закрывает при закрытии:
public class NHibernateSessionHandler : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
var manager = Container.Resolve();
ISession session = manager.OpenSession();
....
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
var session = (NHibernate.ISession)correlationState;
session.Flush();
session.Close();
}
}
Проблема заключается в том, что после использования IStateLessSession при вызове session.Close(); бросается ошибка:
AbstractSessionStore.Remove tried to remove a session which is not on the top or not in the stack at all
at Castle.Facilities.NHibernateIntegration.SessionStores.AbstractSessionStore.Remove(SessionDelegate session) at Castle.Facilities.NHibernateIntegration.SessionDelegate.InternalClose(Boolean closing) at Services.WebHost.Extensions.NHibernateSessionHandler.BeforeSendReply(Message& reply, Object correlationState) in Services\Services.WebHost\Extensions\NHibernateSessionHandler.cs:line 81 at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.BeforeSendReplyCore(MessageRpc& rpc, Exception& exception, Boolean& thereIsAnUnhandledException)
System.InvalidProgramException
Такое впечатление, что при Dispose StatelessSession сразу диспозиться и Session.
Гуру Nhibernate подскажие, как организовать работу приложения при одновременном использовании ISession и IStatelessSession и в чем может быть проблема?