Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
215
Добавлен:
10.05.2015
Размер:
20.41 Mб
Скачать

6.2.6.2. Использование состояния сеанса

Взаимодействовать с состоянием сеанса можно используя класс System.Web.SessionState.HttpSessionState, который на Веб-странице ASP.NET доступен в виде встроенного объекта Session. Синтаксис для добавления элементов в эту коллекцию и их извлечения выглядит практически точно так же, как и синтаксис, который используется для добавления элементов в состояние просмотра страницы.

Например, сохранить объект DataSet в памяти сеанса можно следующим образом:

Session["ds"] = ds;

После этого, его можно извлечь с помощью соответствующей операции преобразования:

ds = (DataSet)Session["ds"];

Контекст состояния сеанса охватывает все приложение и является глобальным для текущего пользователя. Состояние сеанса утрачивается в следующих случаях:

  • если пользователь закрывает и заново запускает браузер;

  • если пользователь получает доступ к той же странице через другое окно браузера при сохранении доступа к Веб-странице из исходного окна браузера (разные браузеры ведут себя по-разному в такой ситуации);

  • если сеанс завершается из-за отсутствия активности со стороны пользователя (по умолчанию сеанс автоматически завершается после 20 минут простоя);

  • если программист завершает сеанс, вызывая метод Session.Abandon().

В первых двух случаях, сеанс фактически остается в памяти, потому что Веб-сервер не имеет ни малейшего понятия о том, что клиент закрыл или сменил окно браузера. Сеанс будет находиться в памяти, оставаясь недоступным, до тех пор, пока, в конце концов, не истечет срок его действия.

6.2.6.3. Поставщики состояния сеанса

Параметр настройки состояния сеанса Mode позволяет указывать, какой поставщик состояния сеанса должен использоваться для хранения данных состояния сеанса между запросами. Допустимые значения описываются ниже.

6.2.6.3.1. Off

Установка значения Off приводит к отключению функции управления состоянием сеанса для всех страниц в приложении. Это может немного повысить производительность Веб-сайтов, которые не используют состояние сеанса.

6.2.6.3.2. InProc

Установка значения InProc напоминает подход, который использовался для хранения состояния сеанса в классической версии ASP. Это значение указывает ASP.NET хранить информацию в текущем домене приложения, что обеспечивает наилучшую производительность, но наименьший срок службы: если администратор перезапустит сервер, данные состояния будут утрачены.

Значение InProc используется по умолчанию и подходит для большинства Веб-сайтов небольшого размера. Однако в сценарии с группой серверов от него не будет никакого толку. Сделать так, чтобы состояние сеанса могли совместно использовать сразу несколько серверов, можно только воспользовавшись внепроцессным поставщиком или службой состояний SQL Server. Еще одна причина, по которой установка значения InProc может быть нежелательной, состоит в том, что оно подразумевает создание более "хрупких" сеансов. В ASP.NET, домены приложений нередко создаются заново в ответ на различные операции типа изменения конфигурационных настроек или обновления страниц, а так же при достижении определенных пороговых значений (независимо от того, произошла ошибка или нет). Если будет обнаружено, что домен приложения часто перезапускается, что приводит к преждевременному завершению сеансов, можно попытаться устранить этот эффект, изменив те или иные параметры модели процесса, или воспользоваться другим более надежным поставщиком состояния сеанса.

Прежде чем использовать внепроцессную модель (StateServer) или службу состояний SQL Server, придется принять во внимание следующие моменты:

  • Когда выбирается режим StateServer или SqlServer, сохраняемые в состоянии сеанса объекты должны допускать сериализацию. Иначе ASP.NET не сможет передавать их службе состояний или сохранять в базе данных.

  • Если ASP.NET обслуживает группа Веб-серверов, придется выполнить некоторые дополнительные конфигурационные шаги для гарантии того, что все Веб-серверы будут работать синхронно. Иначе, не исключено, что один сервер будет кодировать информацию не так, как другой, а это, несомненно, приведет к появлению проблем, если во время сеанса пользователь будет перенаправляться от одного сервера к другому (решением этой проблемы является изменение раздела <machineKey> файла machine.config так, чтобы он был одинаковым на всех серверах).

  • Если не используется внутрипроцессный поставщик состояния, событие SessionStateModule.End не будет инициироваться, и все обработчики этого события в файле global.asax или HTTP-модуле будут игнорироваться.