ASP.NET обрабатывает сеансы внешнего сервера - очистка - PullRequest
1 голос
/ 05 февраля 2010

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

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

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

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

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

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

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

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


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

Ответы [ 3 ]

2 голосов
/ 05 февраля 2010

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

Когда вы создаете свой Singleton, сохраняете ли вы его в объекте приложения, объекте сеанса или объекте кэша?

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

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

Натан Ректор

2 голосов
/ 10 февраля 2010

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

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

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

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

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

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

Натан Ректор

2 голосов
/ 05 февраля 2010

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

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

Мое предложение следующее:

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

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

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

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

...