ASP.NET обрабатывает сеансы внешнего сервера - очистка

Мы "делаем это неправильно"?

Мы с коллегой работаем над страницей ASP.NET, которая служит "порталом" для просмотра результатов диагностической программы на сервере UniData. Несмотря на то, что мы работаем над ASP/ASP.NET, это не наш основной язык.

Чтобы получить доступ к этому серверу, мы должны использовать UniObjects, который является API для аутентификации и использования сервера UniData.

Нам нужно, чтобы каждый пользователь, посещающий веб-сайт, должен был пройти аутентификацию с UniData и получить свой собственный сеанс через библиотеку UniObjects, а затем иметь возможность использовать его без повторного входа (если сеанс не используется в течение "х" минут).

Метод, который мы придумали, заключается в следующем:

У нас есть синглтон с Hashtable. Он сопоставляет имя пользователя Windows с объектом сеанса.

Если пользователь переходит на нашу страницу, и в Hashtable отсутствует имя пользователя, он перенаправляет на страницу входа, где создается объект сеанса и добавляется в Hashtable, если аутентификация прошла успешно. В противном случае он извлекает существующий объект сеанса пользователей из Hashtable и использует его для запроса (если срок его действия не истек, в этом случае мы удаляем его и перенаправляем на страницу входа).

Каждый объект сеанса (который является объектом-оболочкой для вещей из UniObjects) имеет метод "lastUsed". Нам нужно очистить пользовательские сеансы, так как у нас есть лицензионные ограничения для пользователей, вошедших на сервер UniData, поэтому каждый раз, когда пользователь перенаправляется на страницу входа, он проверяет, не использовались ли какие-либо сеансы в течение "х" минут, в этом случае он закрывает этот сеанс и удаляет его из Hashtable. Это сделано здесь, чтобы пользователи не испытывали никаких задержек, связанных с проверкой всех сессий по каждому запросу, только при входе в систему.


Что-то говорит мне, что это решение пахнет, но мне не хватает опыта ASP.NET, чтобы понять, что мы должны делать? Есть ли лучший способ сделать это или все в порядке?

3 ответа

Решение

Поскольку все ваши пользователи, похоже, проходят проверку подлинности, я бы посоветовал вам подумать об использовании другого способа управления состоянием сеанса и временем ожидания.

Часть проблемы, с которой вы столкнулись, заключается в том, что если пользователь просто закрывает браузер без выхода из системы или прекращает использование приложения, вам придется подождать, пока истечет время сеанса, чтобы завершить его и освободить UniObjects для ваших проблем с лицензированием.

Мое предложение заключается в следующем:

  1. Добавьте невидимый IFRAME в свой шаблон MasterPage или на каждую страницу сайта, если вы не используете MasterPages.
  2. Этот MasterPage загрузит страницу KeepAlive.aspx, которая содержит обновление META, и обновляет страницу каждые 5 минут.
  3. Вы можете сократить время ожидания сеанса до 10 минут (возможно, даже до 6)

Теперь, если пользователь закрывает свои окна браузера, время его сеанса истекает намного быстрее, чем обычно, но если его окно браузера остается открытым, его сеанс является постоянным.

Пример кода и пошаговое руководство можно посмотреть здесь.

Теперь вам нужно решение, чтобы пользователь не оставлял окно своего браузера открытым всю ночь и не использовал ваши лицензии UniData. В этом случае я бы применил аналогичную методологию, где застойная страница (то есть пользователь ничего не делал в течение 20 минут) обновляется до страницы ASPX выхода из системы, очищая сеанс.

Когда вы говорите, что используете UniObjects... вы используете набор объектов COM или.NET? Проще всего было бы использовать пул UniObject Conneciton.

Когда вы создаете свой Singleton, вы сохраняете его в объекте Application, Session Object или Cache Object?

Я бы предложил объект Application, поскольку объект Session может делать странные вещи. Одним из способов обработки и проверки тайм-аутов было бы использование ключа кэша с CacheRemoveCallback. Таким образом, вы можете использовать зависимость File/Path Monitor, чтобы отслеживать изменение файла Windows, которое вызывает удаление вручную, или тайм-аут из зависимости Cache.

Обратно к этому является то, что тайм-ауты на зависимостях кэша определяются только активностью страницы, и если сеанс asp.net перезапускается, он может / будет уничтожать зависимости кэша.

Натан Ректор

Если вы используете UniObjects COM, убедитесь, что ваш COM-маршаллинг работает правильно. Взгляни на:

SafeCOMWrapper - управляемая одноразовая безопасная оболочка строгого типа для COM с поздним связыванием http://www.codeproject.com/KB/COM/safecomwrapper.aspx

Еще одна вещь, на которую следует обратить внимание, это то, что у класса динамического массива в UniObjects COM есть проблема с многопоточностью, которая не подходит для.NET. Если вы можете, используйте свой собственный класс динамического массива или разбиение массива в.NET вместо класса динамического массива в UniObjects COM.

Иногда, когда вы пытаетесь получить доступ к данным из класса, он показывает пустую строку, но когда вы отлаживаете, данные там. Не знаю причину этого.

Если вам нужен общий класс динамического массива, который работает с.NET, я могу вам его предоставить.

Насколько мне известно, UniObjects.NET не имеет этих проблем.

Натан Ректор

Другие вопросы по тегам