Состояние сеанса ASP.NET 2 между аутентифицированными пользователями - PullRequest
1 голос
/ 25 августа 2010

Я занимаюсь разработкой веб-сайта для клиента (ASP.NET, T-SQL). Это веб-сайт для ввода данных, позволяющий многим своим пользователям входить в систему и манипулировать записями в одной базе данных.

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

При каждом входе в систему я сохраняю эти инструкции в объекте Session [] для каждого аутентифицированного пользователя. Инструкции одинаковы для всех.

Я посмотрел на решение, которое предлагало сохранить общий идентификатор сеанса в базе данных и затем запросить его для повторного использования этого конкретного сеанса, но это выглядит очень странно. Какое решение для передового опыта для достижения этой цели? Есть ли «общий» объект, доступный для всех пользователей?

Ответы [ 3 ]

4 голосов
/ 25 августа 2010

Во-первых, имеет ли это значение в этот момент? Да, это плохая практика и неэффективно, но если вы храните 20 КБ строк в памяти и имеете максимум 100 пользователей, это 2000 КБ данных. Вряд ли много памяти «впустую». Даже при 200 КБ строк это 20 000 КБ данных. Опять не много. Это стоит вашего времени, и клиент ждет, когда вы решите его, прямо сейчас?

Если вы решите, что это так, вы могли бы:

  1. Сохраните строки в объекте Application или статическом классе так, чтобы они были извлечены один раз и использованы много раз.
  2. Получить строки на каждом просмотре страницы. Это может быть не так вредно для производительности, как кажется.
  3. Используйте что-то вроде Cache class в System.Web.Caching.
  4. Использовать Кэширование вывода .
  5. Используйте Кэш памяти Windows Server AppFabric Velocity .
2 голосов
/ 25 августа 2010

Звучит так, будто вы ищете кэш приложений.Как и Session, это кэш данных в памяти.В отличие от сеанса, он является общим для всех пользователей;каждый пользователь не получает свою индивидуальную копию данных.Кроме того, когда вы добавляете элементы данных в кэш, вы можете указать критерии, которые будут автоматически аннулировать эти данные и вызывать их повторную загрузку / обновление (полезно, когда ваши редко изменяющиеся данные действительно изменяются:).Вот несколько статей, которые должны дать вам все, что вам нужно знать об использовании кэша приложений (и некоторых других опций кэширования в ASP.NET):

1 голос
/ 25 августа 2010

Я бы предложил использовать объект кэша уровня приложения. Он доступен везде как часть HttpContext. Вы можете заполнить его в App_Start.

Вы можете поместить любой объект в Cache, хотя, очевидно, чем меньше, тем лучше.

Вот несколько примеров того, как заполнить его с помощью C #:

1) Добавьте элементы в кэш, как если бы вы добавляли элементы в словарь, указав ключ и значение элемента. Пример: добавьте текущее Value свойство текстового поля в кеш.

Cache["txt1"] = txtName.value;

или

Cache["result"] = dataset;

2) Метод Insert перегружен, что позволяет вам определять значения параметров используемой версии. Пример: добавить только ключ элемента и значение:

Cache.Insert ("MyData1", connectionString);

3) Метод Add имеет ту же сигнатуру, что и метод Insert, но возвращает объект, представляющий добавленный элемент.

Cache.Add("MyData1", connectionString);

Для извлечения из кэша:

stringName = Cache["MyData"];

Если кэшированные данные не являются строкой, вам может потребоваться привести их к нужному типу данных.

result = (DataSet)Cache["result"];

Одним из преимуществ использования объекта Cache по сравнению с объектом Application является то, что CLR создает дамп содержимого Cache, если системе угрожает нехватка памяти.

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