Изучение сессии в ASP.Net

ОГЛАВЛЕНИЕ

Данная статья описывает сессию в ASP.Net 2.0. Разные типы сессии, ее конфигурация. Также описана сессия в веб-ферме, балансировщике нагрузки, веб-саде, и т.д.

Введение

Данная статья дает хорошее понимание сессии. В ней описаны основы сессии, разные типы хранения объекта сессии, поведение сессии в веб-ферме, сессия в балансировщике нагрузки и т.д. Также объяснены особенности поведения сессии в условиях реального производства.

Что такое сессия?

Интернет не сохраняет состояние, а значит, новый экземпляр класса веб-страницы вновь создается при каждой отправке страницы на сервер. Как известно, HTTP - протокол без сохранения состояния, он не способен хранить клиентскую информацию о странице. Если пользователь вставит какие-то данные и перейдет на следующую страницу, то эти данные потеряются, и пользователь не сможет извлечь данные. Что нужно? Нужно хранить информацию. Сессия позволяет хранить информацию в памяти сервера. Она поддерживает хранение любого типа объекта наряду с пользовательским объектом. Для каждого клиента данные сессии хранятся отдельно, то есть данные сессии хранятся согласно клиенту. Посмотрите на следующую схему.

 

Рис. Для каждого клиента данные сессии хранятся отдельно

Управление состоянием с помощью сессии – одно из лучших средств asp.net, потому что оно безопасно, прозрачно от пользователей, и в ней можно хранить любой объект. Наряду с плюсами, порой сессия вызывает проблему быстродействия для сайтов с интенсивным трафиком, потому что сессия хранится в памяти сервера, и клиенты читают данные из самого сервера. Рассмотрим плюсы и минусы использования сессии в веб-приложении.

Плюсы и минусы сессии

Ниже приводятся основные плюсы и минусы использования сессии. Все типы сессий подробно описаны далее.

Плюсы:
•    Сессия помогает хранить состояния и данные пользователя во всем приложении.
•    Она легко реализуется и может хранить любой объект.
•    Хранит данные каждого клиента отдельно.
•    Сессия безопасна и прозрачна для пользователя.

Минусы:
•    Издержки быстродействия в случае большого числа пользователей, так как данные сессии хранятся в памяти сервера.
•    Издержки, связанные с сериализацией и десериализацией данных сессии, так как в случае режимов сессии StateServer и SQLServer объект надо сериализовать перед сохранением.

Кроме того, есть много плюсов и минусов сессии, обусловленных типами сессии. Все они разобраны далее.

Сохранение и извлечение значений из сессии

Сохранение и извлечение значений  сессии очень похоже на ViewState. С состоянием сессии можно взаимодействовать с помощью класса System.Web.SessionState.HttpSessionState, потому что он предоставляет встроенный объект сессии со страницами Asp.Net.

Следующий код применяется для сохранения значения в сессии

      //Сохранение UserName в сессии
       Session["UserName"] = txtUser.Text;

Значения извлекаются из сессии так:

//Проверяется, пустая ли переменная сессии
        if (Session["UserName"] != null)
        {
            //Извлечение UserName из сессии
            lblWelcome.Text = "Welcome : " + Session["UserName"];
        }
        else
        {
         //Делается что-то другое
        }

можно сохранить другой объект в сессии. Следующий пример показывает, как сохранить DataSet в сессии.

        //Сохранение dataset(набор данных) в сессии
        Session["DataSet"] = _objDataSet;  

а следующий код показывает извлечение dataset из сессии

// Проверяется, пустая ли переменная сессии
        if (Session["DataSet"] != null)
        {
            //Извлечение UserName из сессии
            DataSet _MyDs = (DataSet)Session["DataSet"];
        }
        else
        {
            //Делается что-то другое
        }

Идентификатор сессии

Asp.Net использует 120- битный идентификатор для отслеживания каждой сессии. Он достаточно безопасен и не подлежит расшифровке. Когда клиент общается с сервером, между ними передается только идентификатор сессии. Когда клиент запрашивает данные, ASP.NET смотрит на идентификатор сессии и извлекает соответствующие данные.

Это делается путем следующих шагов:
•    Клиент обращается к веб-сайту, и какая-то информация сохраняется в сессии.
•    Сервер создает уникальный идентификатор сессии для этого клиента и сохраняет его в поставщике состояния сессии.
•    Снова клиент запрашивает какие-то данные с этим уникальным идентификатором сессии у сервера.
•    Сервер смотрит на поставщики сессии и извлекает сериализованные данные из сервера состояний и приводит тип объекта.

Посмотрите на наглядную схему,

 

Рис. Взаимодействие клиента, веб-сервера и поставщика состояний