Как я сказал в заголовке, я хочу реализовать сеанс для каждого веб-запроса. Мой провайдер сеанса настроен следующим образом (меня не интересует изменение этой конфигурации).
public class SessionProvider
{
public static SessionProvider Instance { get; private set; }
private static ISessionFactory _SessionFactory;
static SessionProvider()
{
var provider = new SessionProvider();
provider.Initialize();
Instance = provider;
}
private SessionProvider()
{
}
private void Initialize()
{
string csStringName = "ConnectionString";
var cfg = Fluently.Configure()
....ommiting mappings and db conf.
.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
.BuildConfiguration();
_SessionFactory = cfg.BuildSessionFactory();
}
public ISession OpenSession()
{
return _SessionFactory.OpenSession();
}
public ISession GetCurrentSession()
{
return _SessionFactory.GetCurrentSession();
}
}
Внутри Global.asax.cs у меня есть следующий код, связанный с сеансом для каждого веб-запроса.
private static ISessionFactory SessionFactory { get; set; }
protected void Application_Start()
{
SessionFactory = MyDomain.SessionProvider.Instance.OpenSession().SessionFactory;
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
protected void Application_EndRequest(object sender, EventArgs e)
{
var session = CurrentSessionContext.Unbind(SessionFactory);
session.Dispose();
}
При отладке моего веб-приложения я получаю сообщение об ошибке: Текущий контекст сеанса не настроен. ErrorMessage ссылается на строку global.asax CurrentSessionContext.Bind (session);
Обновлено Добавлено .ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
, и теперь у меня появляется сообщение об ошибке при получении данных из моего контроллера, например, это Сообщение об ошибке: Сессия закрыта! Имя объекта: «ISession».
Код контроллера:
using (ISession session = SessionProvider.Instance.GetCurrentSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
data = session.QueryOver<Object>()
...ommiting
transaction.Commit();
return PartialView("_Partial", data);
}
}