Случайный NHibernate IndexOutOfRange Исключение - PullRequest
0 голосов
/ 14 декабря 2010

Случайно NHibernate, кажется, терпит неудачу с Исключением IndexOutOfRange. Код работает большую часть времени, но вызывает случайные сбои приложения.

    public T GetByID<T>(Guid Id) where T : Modules.Common.EntityBase
    {
        try
        {
            ISession session = NHibernateHelper.GetCurrentSession();
            var product = session
                .CreateCriteria(typeof(T))
                .Add(Restrictions.Eq("Id", Id))
                .UniqueResult<T>();
            return product;
        }
        catch (HibernateException ex)
        {
            NHibernateHelper.CloseSession();
            throw;
        }
    }

Я использую код в службе WCF, где ISessions управляются для каждого отдельного httpcontext, поэтому я не думаю, что это связано с безопасностью потоков Исключение исходит от DataReader, поэтому я предполагаю, что оно поступает из строки UniqueResult.

Вот функция получения текущего сеанса

    public static ISession GetCurrentSession()
    {
        if (HttpContext.Current == null)
        {
            lock (sessionLock)
            {
                if (_session == null)
                    _session = sessionFactory.OpenSession();
            }
            return _session;
        }

        HttpContext context = HttpContext.Current;
        ISession currentSession = context.Items[CurrentSessionKey] as ISession;

        if (currentSession == null)
        {
            currentSession = sessionFactory.OpenSession();
            context.Items[CurrentSessionKey] = currentSession;
        }

        return currentSession;
    }

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

возможно длинный выстрел, но проверьте это IndexOutOfRangeException Глубоко в недрах NHibernate

0 голосов
/ 16 декабря 2010

Оказывается, что в WCF HttpConext имеет значение null, поскольку я основал разделение потоков на текущем HTTPContext (при условии, что он функционировал как обычное веб-приложение).

Увидел учебник по Как заставить NHibernate работать с WCF , который выглядел так, как будто он может работать, но имел проблемы с реализацией решения.Однако ДЕЙСТВИТЕЛЬНО кажется сложным использовать этот метод в сценарии для каждого запроса ... есть примерно 5 объектов, он требует изменения каждой из служб.

Обратите внимание, что если они работают только в среде HTTP, выможно использовать атрибут и раздел конфигурации AspNetCompatibilityRequirements, чтобы WCF имел значения HTTPContext.

Класс:

[System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Required)]

public class CaseService : ServiceBase, ICaseService
{
...
}

Web.config:

 <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    ...
 </system.serviceModel>

Я где-то читал, чтоWCFSessionProvider (или что-то в этом роде) предоставляется в NHibernate 3.0, поэтому я подожду, пока это решение не станет реальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...