Answer the question
In order to leave comments, you need to log in
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 questionAsk a Question
731 491 924 answers to any question