@vadim911

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, т.е.:

ITransactionManager TransactionManager = WindsorContainer.Resolve(serviceType);
ITransaction transaction = TransactionManager.CreateTransaction(DEFAULT_TRANSACTION_MODE, DEFAULT_ISOLATION_MODE);
try
{
transaction.Begin();

IDataRepository repo = WindsorContainer.Resolve(IDataRepository);
vat data = repo.GetData();

transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
}

finally
{
Container.Release(commandHandler);
}


Так как приложение использует в основном 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 и в чем может быть проблема?
  • Вопрос задан
  • 2790 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы