我在风中拍打,所以我想我应该在这里问...请让我知道这是否是显而易见的并且之前已得到回答。
我正在构建一个 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);
}
The UserAccessRepository
只需得到userid
来自表单身份验证 cookie。
使用以下命令将会话注入存储库:
ninjectKernel.Bind<IUserRepository>().To<NHUserRepository>();
ninjectKernel.Bind<ILeagueRepository>().To<NHLeagueRepository>().InThreadScope();
ninjectKernel.Bind<ISession>()
.ToMethod(m => MvcApplication.SessionFactory.GetCurrentSession())
会话工厂来自:
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
方法。通过上面的方法,似乎已经解决了。