DomainAccessGuard.Сеансы всегда равны нулю

#sitecore #sitecore6

#sitecore #sitecore6

Вопрос:

Привет, у меня возникли проблемы с интеграцией возможности выгнать пользователей, поскольку sessionCollection всегда имеет значение null.

 public void KickStaleUsers()
    {
        foreach (DomainAccessGuard.Session ses in DomainAccessGuard.Sessions) //<--- This is null
        {
            if (DateTime.Now.Subtract(ses.LastRequest).Minutes >= 60)
            {
                DomainAccessGuard.Kick(ses.SessionID);
                Log.Info("Brugeren ("   ses.UserName   ") er logget ud grundet 60 min. inaktivitet!", this);
            }
        }
    }
  

Я запускаю это из агента

Кто-нибудь знает, почему оно равно null?

Комментарии:

1. Если это DomainAccessGuard. Сеансы, которые имеют значение null, а не отдельный сеанс, который вы тестируете, тогда вам нужно будет опубликовать код, в котором вы создаете объект. Имеет ли значение null DomainAccessGuard, или его коллекция sessions пуста (если значение null, то вам нужно посмотреть в коде класса), или это на самом деле сессия из коллекции, которая имеет значение null?

Ответ №1:

РЕДАКТИРОВАТЬ: смотрите Комментарий к вопросу. Требуется дополнительный код / пояснения.

Если DomainAccessGuard равно null, то опубликуйте код, из которого вы создаете объект.

Если DomainAccessGuard.Sessions значение пустое, то опубликуйте код, в котором заполняется коллекция сеансов.

Если DomainAccessGuard.Sessions (коллекция) имеет значение null , то вам нужно будет опубликовать код, в котором создается экземпляр коллекции — хотя я бы счел это немного странным.

Если пользователь DomainAccessGuard.Session из коллекции, к UserName которой вы пытаетесь получить доступ, имеет значение null, то может применяться следующее:

Мне кажется, что вы пытаетесь прочитать имя пользователя из сеанса, который вы только что запустили. Разве это не сделает ваш сеанс нулевым?

Это может сработать:

 Log.Info("Brugeren ("   ses.UserName   ") er logget ud grundet 60 min. inaktivitet!", this);
DomainAccessGuard.Kick(ses.SessionID);
  

Это всего лишь предположение, я ничего не знаю о DomainAccessGuard.

Комментарии:

1. DomainAccessGuard может быть создан, но все методы статичны, поэтому в этом нет смысла, или я что-то упускаю?

Ответ №2:

Вам нужно вызвать DomainAccessGuard.GetAccess() , чтобы инициализировать коллекцию сеансов

 if(DomainAccessGuard.GetAccess())
{
    foreach (DomainAccessGuard.Session ses in DomainAccessGuard.Sessions) //<--- This is null
    {
        if (DateTime.Now.Subtract(ses.LastRequest).Minutes >= 60)
        {
            DomainAccessGuard.Kick(ses.SessionID);
            Log.Info("Brugeren ("   ses.UserName   ") er logget ud grundet 60 min. inaktivitet!", this);
        }
    }
}
  

Комментарии:

1. Это не работает, я все еще получаю сообщение NullReference: Exception: System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта. Источник: Sitecore. Ядро в Sitecore.Web.Authentication. DomainAccessGuard. Получите доступ (User DomainUser пользователя) в FTZ.CMS.Automatics. Пользовательский агент. KickStaleUsers() в C:WebsiteAutomaticsUserAgent.cs:line 15

2. хм. Когда я попробовал это внутри тестового метода MVC, я получил вышеуказанную ошибку, но добавление метода GetAccess () заставило его работать. Используя reflector, я обнаружил, что это метод, который создает экземпляр коллекции Sessions. Я только что попробовал то же самое в запланированной задаче, и вы правы, метод GetAccess() выдает указанную выше ошибку, однако, если я удалю его, он будет работать нормально. Делаете ли вы что-нибудь еще в своем агенте, например, переключаете контекст сайта или что-то еще?

3. Не уверен, имеет ли это значение, но я использую последнюю версию 6.4.1 (110324)

4. Я нахожусь на версии 6.4.0, проверяю список изменений для версии 6.4.1

5. В журнале изменений ничего нет, и я все еще получаю сообщение об исключении ошибки: System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта. Источник: FTZ.CMS на сайте FTZ.CMS.Automatics. Пользовательский агент. KickStaleUsers() в C:WebsiteAutomaticsUserAgent.cs:line 16

Ответ №3:

Вот некоторая документация sitecore, которая предоставляет пример того, как уменьшить время ожидания сеанса.

Он выполняется как агент, а также имеет Assert .Не выполняется полная проверка сеанса.

Надеюсь, это поможет