Изучение сессии в ASP.Net - Режим сессии сервера состояний

ОГЛАВЛЕНИЕ

Режим сессии сервера состояний

Обзор режима сессии сервера состояний

Он также называется внепроцессным режимом сессии. Сервер состояний использует автономные службы Windows, не зависящие от IIS и способные работать на отдельном сервере. Этим состоянием сессии полностью управляет aspnet_state.exe. Этот сервер может работать в той же системе, но он находится вне основного домена приложения, где работает веб-приложение. При перезапуске процесса asp.net данные сессии сохраняются. Такой подход имеет несколько недостатков из-за издержек сериализации и десериализации, он также увеличивает издержки доступа к данным, так как при каждом извлечении данных сессии пользователем приложение обращается к другому процессу.

 

Конфигурация для режима сессии сервера состояний

В StateServer данные сессии хранятся в отдельном сервере, не зависящем от IIS и управляемом aspnet_state.exe. Этот процесс работает как службы windows. Эту службу можно запустить из консоли управления windows или из командной строки.

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

 

из командной строки, набрав "net start aspnet_state". По умолчанию эта служба слушает порт TCP 42424, но можно изменить порт из редактора реестра, как показывает рисунок ниже.

 

Теперь посмотрим на конфигурацию web.config для установки сервера состояний. Для установки сервера состояний надо задать stateConnectionString. Она будет идентифицировать систему, являющуюся работающим сервером состояний. По умолчанию stateConnectionString использует IP-адрес 127.0.0.1 (localhost) и порт 42424.

 

При использовании сервера состояний можно сконфигурировать атрибуты stateNetworkTimeOut, чтобы задать максимальное число секунд ожидания ответа от службы до отмены запроса. Время по умолчанию - 10 секунд.

 

При использовании сервера состояний объект должен сериализоваться при сохранении и десериализоваться при извлечении. Это описано в примере.

Как работает режим сессии сервера состояний?

Режим сессии сервера состояний используется для предотвращения ненужной потери данных сессии при перезапуске веб-сервера. Сервер состояний обслуживается процессом aspnet_state.exe как служба windows. Этот процесс хранит все данные сессии. Но надо сериализовать данные перед их сохранением в режиме сессии сервера состояний.

 

Как показано на рисунке выше, сначала клиент отправляет запрос веб-серверу, затем веб-сервер сохраняет данные сессии на сервере состояний. Сервер состояний может быть текущей системой или другой системой. Но он абсолютно независим от IIS. Адрес сервера состояний будет зависеть от установки атрибута stateConnectionString в web.config. если установить его в 127.0.0.1:42424, он будет хранить данные в самой локальной системе. Чтобы сменить адрес сервера состояний, надо сменить IP и убедиться, что aspnet_state.exe запущен и работает в той системе. Иначе выдается следующее исключение при попытке сохранить данные в сессии.

 

Любой объект должен быть сериализован перед сохранением в сессии. Эти данные сохраняются в системе сервера состояний с помощью поставщика состояний. При извлечении данных поставщик состояний возвращает данные. Полный порядок операций дан на рисунке ниже.

 

Пример режима сессии сервера состояний:

Это простой пример использования режима сессии сервера состояний. Пример веб-приложения был создан прямо на IIS, чтобы было легко понять его применение.

Шаг 1: Открыть Visual Studio > Файл(File)>Новый(New)> Веб-сайты(Web Sites). Выбрать расположение как HTTP и создать веб-приложение.

 

Теперь если вы откроете IIS, то увидите виртуальный каталог, созданный с именем вашего веб-приложения, в данном примере это StateServer.

 

Шаг 2: Создать простой пользовательский интерфейс, принимающий номер списка и имя ученика. Имя и список будут сохраняться в сессии сервера состояний. Также был создан класс "StudentInfo", приведенный ниже.

[Serializable]
public class StudentInfo
{
    //Конструктор по умолчанию
    public StudentInfo()
    {
       
    }
    /// <summary>
    /// Создается объект класса студент
    /// </summary>
    /// <param name="intRoll">Int RollNumber</param>
    /// <param name="strName">String Name</param>
    public StudentInfo(int intRoll, string strName)
    {
        this.Roll = intRoll;
        this.Name = strName;
    }

    private int intRoll;
    private string strName;
    public int Roll
    {
        get
        {
            return intRoll;
        }
        set
        {
            intRoll = value;
        }
    }

    public string Name
    {
        get
        {
            return strName;
        }
        set
        {
            strName = value;
        }
    }
}

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

protected void btnSubmit_Click(object sender, EventArgs e)
    {
       
        StudentInfo _objStudentInfo = new StudentInfo(Int32.Parse( txtRoll.Text) ,txtUserName.Text);
        Session["objStudentInfo"] = _objStudentInfo;
        ResetField();
    }
    protected void btnRestore_Click(object sender, EventArgs e)
    {
        StudentInfo _objStudentInfo = (StudentInfo) Session["objStudentInfo"];
        txtRoll.Text = _objStudentInfo.Roll.ToString();
        txtUserName.Text = _objStudentInfo.Name;
        
    }

Шаг 3: Сконфигурировать web.config для сервера состояний, как уже было сказано. Убедиться, что aspnet_state.exe запущен и работает на сконфигурированном сервере.

Шаг 4: Запустить приложение

 

Ввести данные, нажать на Отправить. Следующий тест покажет, в чем именно польза сервера состояний.

Первый: Удалите ключевое слово [Serializable] из класса studentinfo и попробуйте запустить приложение. При нажатии на кнопку «Отправить» вы получите следующую ошибку

 

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

Второй: Запустите приложение, сохраните данные, нажав на кнопку «Отправить». Перезапустите IIS

 

Теперь в случае InProc вы уже потеряли данные сессии, но это StateServer. Щелкните по «Восстановить сессию» и получите исходные данные, потому что данные сервера состояний не зависят от IIS. Сервер состояний хранит данные отдельно.

Третий: Остановите aspnet_state.exe из консоли управления службами Windows и отправьте данные. Вы получите следующую ошибку,

 

потому что процесс сервера состояний не работает. Не забывайте про три перечисленных момента.

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

Исходя из вышесказанного:

Плюсы
•    Данные хранятся отдельно от IIS, поэтому проблемы с IIS не мешают данным сессии.
•    Он полезен в веб-ферме и веб-саде.

Минусы
•    Процесс медленный из-за сериализации и десериализации
•    Сервер состояний всегда должен быть запущен и работать.

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