C# NHibernate投掷会话已关闭

C# NHibernate投掷会话已关闭,c#,asp.net-mvc-3,nhibernate,fluent-nhibernate,ninject,C#,Asp.net Mvc 3,Nhibernate,Fluent Nhibernate,Ninject,我在风中飘动,所以我想我应该在这里问。。。请让我知道这是否是显而易见的,并已回答之前 我正在构建一个MVC 3站点,当我用一个用户运行它时,它工作得很好,我在这里点击页面。然而,如果我疯狂地点击刷新,最终我会点击“会话关闭” 我已经把我所有的存储库都隔离出来,试图弄清到底,所以我知道主页上有错误。存储库中唯一调用的是从数据库表中获取用户名 我使用Postgres作为数据库,使用NauckIT的ASP.NET成员资格提供程序。主数据库也是Postgres(但另一个数据库) 会话管理使用以下代码完成

我在风中飘动,所以我想我应该在这里问。。。请让我知道这是否是显而易见的,并已回答之前

我正在构建一个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);
    }
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;
公共类NHibernateHelper
{
私人静态ISessionFactory_sessionFactory;
公共静态ISessionFactory会话工厂
{
得到
{
if(_sessionFactory==null)
{var rawConfig=新配置();
SetNamingStrategy(新的PostgresNamingStrategy());
var configuration=fluntly.Configure(rawConfig)
.Database(PostgreSQLConfiguration.Standard.ConnectionString(ConnectionString.ShowSql().dialent(“NHibernate.dialent.postgresql82dialent”))
.Mappings(m=>
m、 AutoMappings.Add(AutoMap.AssemblyOf(新的AutoMapConfiguration())
)).ExposeConfiguration(cfg=>
SetProperty(“当前会话上下文类”、“web”)
_sessionFactory=configuration.BuildSessionFactory();
Debug.WriteLine(“构建的会话工厂”);
}
返回工厂;
明确地说,它在我点击页面的标准实例中运行良好,但是当我疯狂地点击F5时,我得到了会话关闭问题

更新:
不确定它是否相关,但我在
BaseController
中看到的主要地方是在
OnActionExecuting
方法中。它似乎已经在上面的方法中清除了。

您不应该在web应用程序中使用
InThreadScope()
。使用
InRequestScope()
.EDIT阅读一下-它最近更新过,不知道它是向后的,这迟早会浪费你的时间


如果您希望在成员资格提供程序和请求处理中实现这些功能,则需要搜索Ninject自定义提供程序(可能类似).

我的第一个问题是:为什么整个
Begin/EndRequest
设置都没有将每个会话生命周期范围的
ISession
注入控制器?我发现的第一个示例是每个请求会话…很高兴有一个替代方案..找到链接了吗?@Trustme-I'maDoctor这是一种非常常见的方法…并不是说这是最好的方法,但我肯定到处都能看到它。@Sonicthlichen奇怪,这是我第一次看到它。用正确的生存期范围注入依赖项感觉更简单……但不管怎样:)无论如何,我不知道Ninject,但我确信有一个选项可以将依赖项生存期范围设置为“每HTTP请求”。Ninject有InRequestScope()成员资格提供程序是独立的,并且使用direct ADO.NET而不是NHibernate,因此此部分不使用会话。我将尝试替换它并报告back@Martin好-这对你来说少了一点困惑。底线是你需要a)将需要
Dispose
al的东西绑定到[unspecified]以外的范围中(隐式瞬态)或]瞬态,但b)执行stuff
InThreadScope()
都会阻止在请求结束时进行处理,并导致在将来的某个时间点进行随机处理(以及在多个恰好已调度的请求中使用此类对象[用于某些处理]在同一个线程上:D有效,必须将所有内容都更改为InRequestScope。我可能能够通过一些优化(即找出那些实际上需要在InRequestScope中的内容和那些不需要的内容)随着时间的推移减少这些内容,但现在它起作用了。
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;