Asp.net NHibernate:获取所有打开的会话

Asp.net NHibernate:获取所有打开的会话,asp.net,nhibernate,session,sessionfactory,Asp.net,Nhibernate,Session,Sessionfactory,我有一个带有NHibernate的ASP.NET应用程序,由于某些原因,很少有开发人员忘记关闭某些页面中的会话(我想是20个),我知道最好的解决方案是浏览每个页面并确保会话正确关闭,但我不能做这种移动,因为代码已经在生产中。因此,我试图找到一种方法来获取会话工厂中所有打开的会话,然后使用母版页或使用其他进程关闭它,但我找不到一种方法来做到这一点 那么,有没有办法获得所有打开的会话?或者设置会话空闲超时或其他什么,你有什么建议?。谢谢您的建议。据我所知,不支持从会话工厂获取打开会话的列表。我有自己

我有一个带有NHibernate的ASP.NET应用程序,由于某些原因,很少有开发人员忘记关闭某些页面中的会话(我想是20个),我知道最好的解决方案是浏览每个页面并确保会话正确关闭,但我不能做这种移动,因为代码已经在生产中。因此,我试图找到一种方法来获取会话工厂中所有打开的会话,然后使用母版页或使用其他进程关闭它,但我找不到一种方法来做到这一点


那么,有没有办法获得所有打开的会话?或者设置会话空闲超时或其他什么,你有什么建议?。谢谢您的建议。

据我所知,不支持从会话工厂获取打开会话的列表。我有自己的方法来关注开放会话,我使用以下结构:

创建对ISession具有弱引用的类。这样,如果正在对会话进行垃圾收集,则不会中断垃圾收集器:

public class SessionInfo
{
    private readonly WeakReference _session;

    public SessionInfo(ISession session)
    {
        _session = new WeakReference(session);
    }

    public ISession Session
    {
        get { return (ISession)_session.Target; }
    }
}
创建用于存储打开的会话的列表:

List<SessionInfo> OpenSessions = new List<SessionInfo>();

这样,我可以维护一个打开会话的列表,在需要时可以查询这些会话。也许这能满足您的需要?

您的会话是如何管理的?(每个请求等)您可以在会话工厂周围编写包装器,但如何知道可以关闭哪个会话?也许“最好的解决方案”是唯一的解决方案。感谢Alex和GertArnold,会话是根据每个页面中的每个请求进行管理的,因此如果我们获得一些客户端详细信息,例如一个会话被打开,然后关闭(好吧,它被认为是关闭的,但在某些情况下不是)。另一种方法可能是通过NHibernate统计,但您需要先启用它。如果你想知道怎么做,请告诉我,因为我喜欢自己的实现。
public ISession GetNewSession()
{
    if (_sessionFactory == null)
        _sessionFactory = createSessionFactory();      
    ISession session = _sessionFactory.OpenSession();
    OpenSessions.Add(new SessionInfo(session));
    return session;
}