我在这里询问,因为我感到困惑。我正在构建一个MVC 3网站,当我用一个用户浏览网页时一切正常。但是,如果我疯狂地刷新页面,最终会出现“会话已关闭”的错误。
我已经几乎完全隔离了所有的仓库,以此来排除故障,所以我知道它出错在主页上。仓库中唯一被调用的事情是从数据库表中获取用户姓名。
我使用Postgres作为数据库,并使用NauckIT的ASP.NET会员提供程序。主要数据库也是Postgres(但是另一个数据库)。
以下代码用于管理会话:
public class MvcApplication : System.Web.HttpApplication
{
public static ISessionFactory SessionFactory =
NHibernateHelper.GetSessionFactory();
public MvcApplication()
{
this.BeginRequest += MvcApplication_BeginRequest;
this.EndRequest += MvcApplication_EndRequest;
}
void MvcApplication_BeginRequest(object sender, EventArgs e)
{
CurrentSessionContext.Bind(SessionFactory.OpenSession());
}
void MvcApplication_EndRequest(object sender, EventArgs e)
{
CurrentSessionContext.Unbind(SessionFactory).Dispose();
}
}
获取登录信息的代码如下:
public Login GetCurrentLogin()
{
return Session.Query<Login>().FirstOrDefault(l => l.UserID == UserAccessRepository.UserID);
}
UserAccessRepository
仅从表单身份验证cookie中获取userid
。会话是使用以下方式注入存储库的:
ninjectKernel.Bind<IUserRepository>().To<NHUserRepository>();
ninjectKernel.Bind<ILeagueRepository>().To<NHLeagueRepository>().InThreadScope();
ninjectKernel.Bind<ISession>()
.ToMethod(m => MvcApplication.SessionFactory.GetCurrentSession())
SessionFactory 来源于:
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{ var rawConfig = new Configuration();
rawConfig.SetNamingStrategy(new PostgresNamingStrategy());
var configuration = Fluently.Configure(rawConfig)
.Database(PostgreSQLConfiguration.Standard.ConnectionString(ConnectionString).ShowSql().Dialect("NHibernate.Dialect.PostgreSQL82Dialect"))
.Mappings(m =>
m.AutoMappings.Add(AutoMap.AssemblyOf<Event>(new AutoMapConfiguration())
)).ExposeConfiguration(cfg =>
cfg.SetProperty("current_session_context_class", "web")
_sessionFactory = configuration.BuildSessionFactory();
Debug.WriteLine("Built SessionFactory");
}
return _sessionFactory;
需要澄清的是,在我点击页面浏览时,一切正常,但当我疯狂地按F5时,会出现会话关闭的问题。
更新:
不确定是否相关,但我在BaseController
中看到了这个问题,出现在OnActionExecuting
方法内部。在上面的方法中似乎已经解决了这个问题。
Begin/EndRequest
设置,而不是将每个会话生命周期范围的ISession
注入控制器? - Patryk Ćwiek