NHibernate - “会话已关闭!对象名称:'ISession'

时间:2011-06-03 14:32:11

标签: c# nhibernate

我在MVC3应用程序中的自定义成员资格提供程序上使用NHibernate。每当我尝试登录时,我都会得到例外:

  

会话已结束!   对象名称:'ISession'

会员提供者中的代码如下所示:

ContractRepository repository;
public string UserDescription { get; set; }

public CustomSqlMembershipProvider() {
    this.repository = new ContractRepository(ProviderPortal.Persistance.NHibernateSessionStorage.RetrieveSession());
}

public override bool ValidateUser(string username, string password) {
    var user = repository.GetContractForUser(username);
    if (user == null)
        return false;
    else {
        UserDescription = user.Description;
        return true; //TODO: come back and add user validation.
    }
}

这是检索会话方法:

public static ISession RetrieveSession() {
    HttpContext context = HttpContext.Current;
    if (!context.Items.Contains(CURRENT_SESSION_KEY)) OpenCurrent();
    var session = context.Items[CURRENT_SESSION_KEY] as ISession;
    return session;
}

private static void OpenCurrent() {
    ISession session = NHibernateConfiguration.CreateAndOpenSession();
    HttpContext context = HttpContext.Current;
    context.Items[CURRENT_SESSION_KEY] = session;
}

这是异常发生的地方:

public Contract GetContractForUser(string UserName) {
    return (Contract)session.CreateCriteria(typeof(Contract))
        .Add(Restrictions.Eq("Login", int.Parse(UserName))).UniqueResult();
}

在调用的CustomSqlMembershipProvider构造函数和调用的ValidateUser方法之间的某个位置,会话正在关闭。有任何想法吗?我的其他控制器通过DI注入了一个开放的会话,但是这个给了我最难的时间。

1 个答案:

答案 0 :(得分:1)

你是持续地还是一次性地获得这个?

我们使用Spring.net为我们的DI并使用OpenSessionInView

我们必须添加以下http模块来更改当前线程的存储选项。

public class SpringThreadStorageModule : IHttpModule
{
    static SpringThreadStorageModule()
    {
        LogicalThreadContext.SetStorage(new HybridContextStorage());
    }



    #region IHttpModule Members

    public void Dispose()
    {
        // do nothing
    }

    public void Init(HttpApplication context)
    {
        // we just need the staic init block.
    }

    #endregion
}