【问题标题】:asp.net custom role provider nhibernate errorasp.net 自定义角色提供程序 nhibernate 错误
【发布时间】:2011-06-04 06:36:40
【问题描述】:

嗨,

我正在我的 nhibernate 应用程序中实现自定义角色提供程序 我有一个存储库,每当我想访问 nhibernate 会话时都会调用它。

所以当我的角色提供者初始化自己时

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) {

            base.Initialize(name, config);
            Repository = new Repository();
        }

然后我覆盖

public override string[] GetRolesForUser(string username) {
        var users = Repository.QueryAll<Users>();

//我然后过滤等等

    }

但是当这个函数被调用时,我总是得到一个错误,即 NHibernate 会话已关闭。 我调试了 nhibernate 源代码,结果发现这里的会话与我的控制器中的会话有不同的 guid(我也在使用 ASP.NET MVC)。 当我到达这里时,这个特定的会议已经结束。 不知道谁关了我知道它是在应用程序启动时才启动的。

有人知道我做错了什么吗? 我仍想在此提供程序中使用 Nhibernate,但不再收到错误消息。 谢谢

【问题讨论】:

  • 你的会话管理策略是什么?
  • 我在 application_start 上启动了一个会话工厂,并在存储库构造函数中获得了当前会话
  • 我的意思是您在何时何地打开和关闭会话?

标签: asp.net nhibernate roleprovider


【解决方案1】:

我遇到了似乎完全相同的问题。不要忘记 Role 和 Membership 提供程序只实例化一次并且在应用程序的整个生命周期内都存在。如果您使用 Session per Web request 模式,则 ISession 将在第一个请求后关闭,然后对提供程序内部的 ISession 的任何引用对于后续请求都可能为 null。

您可以通过注入对 ISessionFactory 的引用并调用 GetCurrentSession 来解决此问题,而不是直接持有对 ISession 的引用。

【讨论】:

    【解决方案2】:

    这就是我最终修复它的方式。

    在我的存储库类中,我有这个:

    public Repository()
    {
        this.Session = SessionManager.GetCurrentSession();
    }
    

    我完全删除了构造函数 我把这个改为:

    private ISession _session;
            protected ISession Session
            {
                get
                {
                    if (_session == null)
                    {
                        _session = SessionManager.GetCurrentSession();
                    }
                    return _session;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2014-10-15
      相关资源
      最近更新 更多