我在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注入了一个开放的会话,但是这个给了我最难的时间。
答案 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
}