NHibernate - "Сессия закрыта! Имя объекта: 'ISession' - PullRequest
0 голосов
/ 03 июня 2011

Я использую 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, но этот дает мне самое трудное время.

1 Ответ

1 голос
/ 03 июня 2011

Вы получаете это постоянно или включаете и выключаете?

Мы получали это, используя 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...