V
V
vadim9112012-04-07 09:52:46
.NET
vadim911, 2012-04-07 09:52:46

ISession and IStatelessSession in the same web service at the same time

Colleagues, help with advice.

There is a WCF service, a bunch of Fluent NHibernate + Castle Winsor is used to access data.

The situation is as follows, there is the following piece of code in the repository - the data source:

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 и в чем может быть проблема?

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question