2011-01-05 7 views
3

HI、asp.netカスタムロールプロバイダNHibernateのエラー

私は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>(); 

を上書き自体を初期化するときに

} 

しかし、この関数が呼び出されたI上NHibernateセッションが閉じているというエラーが常に出ます。 私はnhibernateのソースコードをデバッグしました。そして、ここのセッションは私のコントローラのセッションとは異なるGUIDを持っていることが分かりました(私もASP.NET MVCを使っています)。 このセッションは私がここに来る頃に閉鎖されています。 誰がそれを閉じるのか分かりません。私はそれがアプリケーションが起動したときに開始されることを知っています。

誰かが私が間違っていることを知っていますか? このプロバイダでNhibernateを使用したいが、それ以上エラーは発生しない。 ありがとうございました

+0

あなたのセッション管理戦略は何:

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

は、私はこの代わりに入れコンストラクタ完全 を削除? –

+0

私はapplication_startでセッションファクトリを開始し、リポジトリコンストラクタでCureentセッションを取得します。 – Para

+0

いつ、どこでセッションを開いたり閉じたりするのですか? –

答えて

1

これは私がそれを明白に修正した方法です。私のリポジトリクラスの

が、私はこれを持っていた:

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

私はまったく同じ問題を抱えていました。ロールとメンバシッププロバイダは、一度しかインスタンス化されず、アプリケーションの存続期間中存在することを忘れないでください。セッションごとのWebリクエストパターンを使用している場合、最初のリクエストの後でISessionが閉じられ、プロバイダの内部のISessionへの参照は、後続のリクエストでnullになる可能性があります。

この問題を回避するには、ISessionへの参照を直接保持するのではなく、ISessionFactoryへの参照を注入してGetCurrentSessionを呼び出します。

関連する問題