#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 .Не выполняется полная проверка сеанса.
Надеюсь, это поможет