Я использую NHibernate на провайдере пользовательского членства в приложении MVC3. Когда я пытаюсь войти, я получаю исключение:
Сессия закрыта!
Имя объекта: '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, но этот дает мне самое трудное время.