Понимание состояния сеанса asp.net
Автор:Eve Cole
Время обновления:2009-07-01 16:44:49
1. Функции состояния сеанса
HTTP — это протокол без отслеживания состояния, поэтому он не указывает автоматически, поступает ли вся последовательность запросов от одного и того же клиента или даже активно ли один экземпляр браузера просматривает страницу или сайт. И используя встроенную функцию состояния сеанса ASP.net, мы можем использовать
1. Автоматически идентифицировать и классифицировать запросы от одного браузерного клиента к логическому сеансу приложения на сервере.
2. Храните данные сеанса на сервере для использования в нескольких запросах браузера.
3. Вызывайте соответствующие события управления временем существования сеанса (Session_OnStart, Session_OnEnd и т. д.), которые можно обрабатывать в коде приложения.
2. Идентификация статуса сеанса
При создании сеанса сервер генерирует отдельный идентификатор для каждого сеанса. Идентификатор представлен 120-битной строкой SessionID, которая содержит только символы ASCII, разрешенные в URL-адресе. Значение SessionID генерируется с использованием алгоритма, гарантирующего уникальность и случайность. Целью гарантии уникальности является обеспечение отсутствия конфликтов между сеансами, а целью гарантии случайности — обеспечение того, чтобы злонамеренные пользователи не могли использовать новые идентификаторы SessionID для расчета количества существующих. сеансы.
3. Как сохранить состояние сеанса
Существует три способа хранения состояния сеанса:
1. Режим состояния внутрипроцессного сеанса (Inproc). Когда мы создаем новую веб-программу, по умолчанию применяется режим состояния внутрипроцессного сеанса. Это также режим, обычно используемый всеми. В этом режиме состояние сеанса сохраняется локально в рабочем процессе ASP.NET, поэтому режим внутрипроцессного состояния сеанса, вероятно, является самым быстрым вариантом доступа. Но чем больше данных хранится в сеансе, тем больше памяти потребляет веб-сервер, что потенциально увеличивает риск снижения производительности.
2. Режим сервера состояний .NET (StateServer): состояние сеанса сохраняется в удаленном процессе (например, в службе Windows NT с именем aspnet_state.exe).
3. Режим SQL (SQLServer). Состояние сеанса хранится в специальной таблице базы данных, управляемой SQL Server.
И режим сервера состояний .NET, и режим SQL можно назвать режимом внепроцессного сеанса. При хранении данных данные необходимо сериализовать и сохранить во внешнем репозитории. При чтении и данных данные необходимо десериализовать и скопировать. в словарь локального сеанса, поэтому запрос привел к снижению производительности от 15 % (вне процесса) до 25 % (SQL Server). Обратите внимание, что это лишь приблизительная оценка. Но в сценарии внепроцессного хранения состояние сеанса сохраняется дольше, что делает приложение более мощным, поскольку оно защищает от сбоев Microsoft® Internet Information Services (IIS) и ASP.NET. Отделив состояние сеанса от приложений, вы также можете легче расширить существующие приложения до архитектур веб-фермы и веб-сада. Кроме того, состояние сеанса сохраняется во внешнем процессе, что существенно исключает риск периодической потери данных из-за циклов процесса.
4. Настройка состояния сеанса
Конфигурация состояния сеанса достигается путем установки раздела файла Web.config. Ниже представлены конкретные методы настройки трех состояний сеанса.
1. Режим работы
Режим «В процессе» — это режим состояния сеанса по умолчанию. Чтобы использовать внутрипроцессный режим, установите для атрибута mode элемента значение Inproc.
Ниже показан пример настройки конфигурации для режима «в процессе». http://www.downcodes.com
<конфигурация>
<система.веб>
<sessionState mode="Inproc"
без файлов cookie="ложь"
таймаут="20"/>
</sessionState>
</system.web>
</конфигурация>
2. Режим сервера состояний
Чтобы использовать сервер состояний, необходимо сначала убедиться, что служба состояний ASP.NET запущена на удаленном сервере, используемом для хранения сеансов. Эта служба устанавливается вместе с ASP.NET и Visual Studio .NET по адресу:
systemrootMicrosoft.NETFrameworkversionNumberaspnet_state.exe
Затем в файле Web.config приложения установите для атрибута режима элемента значение StateServer. Наконец, установите для свойства ConnectionString значение tcpip=serverName:portNumber.
Ниже приведен пример параметров конфигурации для режима сервера состояний.
<конфигурация>
<система.веб>
<sessionState mode="StateServer"
stateConnectionString="tcpip=dataserver:42424"
без файлов cookie="ложь"
таймаут="20"/>
</sessionState>
</system.web>
3. Режим SQL-сервера
Чтобы использовать SQL Server, сначала запустите InstallSqlState.sql или InstallPersistSqlState.sql на компьютере SQL Server, где будет храниться состояние сеанса. Оба сценария создают базу данных с именем ASPState, содержащую несколько хранимых процедур.
Разница между этими двумя сценариями заключается в том, где размещаются таблицы ASPStateTempApplications и ASPStateTempSessions. Сценарий InstallSqlState.sql добавляет эти таблицы в базу данных TempDB, которая потеряет данные при перезагрузке компьютера. Вместо этого сценарий InstallPersistSqlState.sql добавляет эти таблицы в базу данных ASPState, что позволяет сохранять данные сеанса при перезагрузке компьютера.
По умолчанию оба файла сценария устанавливаются в следующую папку:
системный кореньMicrosoft.NETFrameworkversionNumber
Затем в файле Web.config приложения установите для атрибута режима элемента значение SQLServer. Наконец, установите для свойства sqlConnectionString значение Integrated Security=SSPI;data source=serverName;.
Ниже показан пример конфигурации для режима SQL Server.
<конфигурация>
<система.веб>
<sessionState mode="SQLServer"
sqlConnectionString="Встроенная безопасность=SSPI;источник данных=сервер данных;"
без файлов cookie="ложь"
таймаут="20"/>
</sessionState>
</system.web>
</конфигурация>
В режиме SQL Server состояние сеанса также можно настроить для работы в отказоустойчивом кластере. Отказоустойчивый кластер — это два или более идентичных резервных веб-серверов, которые хранят данные сеанса в базе данных SQL Server на отдельном компьютере. В случае сбоя одного веб-сервера другой сервер в кластере берет на себя его работу и обслуживает запросы без потери данных сеанса.
Чтобы настроить отказоустойчивую кластеризацию, задайте для элемента в файле Web.config веб-сервера то же значение.
Затем настройте строку подключения SQL веб-сервера так, чтобы она указывала на базу данных SQL Server на вашем компьютере, где хранятся данные сеанса.
5. Доступ к состоянию сеанса
Вы можете получить доступ к состоянию сеанса непосредственно через коллекцию сеансов. Для совместимости с более ранними версиями ASP доступ к состоянию сеанса также можно получить через свойство Session.Contents объекта приложения.
В следующем примере показана запись двух значений в коллекцию Session на первой веб-странице, а затем чтение коллекции Session на второй веб-странице. Примечание. Коды страниц здесь опущены.
Первая веб-страница записывает значение в коллекцию сеансов.
тусклое имя как строка = "a"
тусклый идентификатор как целое число = "1"
сеанс("имя") = имя
сеанс («идентификатор») = идентификатор
Вторая веб-страница получает значение из коллекции сеансов.
тусклое имя как строка = сеанс («имя»)
тусклый идентификатор как целое число = сеанс («id»)
'Получаем количество элементов в коллекции состояний сеанса
dim я как целое число = session.count
Обратите внимание, что во внутрипроцессном режиме реальной сериализации и десериализации не происходит, поэтому объекты сохраняются в состоянии сеанса как активные экземпляры соответствующих классов.
В режиме сеанса вне процесса, поскольку используются сериализация и десериализация, вам необходимо преобразовать тип данных в соответствии с ситуацией.
Если вы сериализуете значение даты, дата должна иметь тип Int64.
6. События управления временем существования сеанса
Существует два события управления временем существования сеанса: событие Session_OnStart и событие Session_OnEnd. Их можно установить в файле Global.asax.VB.
1. Событие Session_OnStart
Когда один клиент браузера подключается к серверу, запускается событие Session_OnStart, которое отмечает начало сеанса. Это событие больше не будет запускаться во время последующего просмотра, если время сеанса не истечет или он не будет прерван. Событие Session_OnStart — лучшее время для установки переменных сеанса, поскольку они устанавливаются до доступа к какой-либо странице.
Пример. В следующем примере показан часто используемый код события Session_OnStart для подсчета количества людей в сети:
Sub Session_Start (отправитель ByVal как объект, ByVal e как EventArgs)
'Когда происходит событие, добавьте 1 к числу онлайн-пользователей
Приложение("количество пользователей") = Приложение("количество пользователей") + 1
Конец субтитра
2. Событие Session_OnEnd
Событие Session_OnEnd возникает, когда сеанс прерывается или истекает время ожидания, и отмечает конец события. Но обратите внимание, что это событие поддерживается только в режиме InProc. Вы можете указать период ожидания с помощью атрибута timeout раздела файла Web.config. Если пользователь находится в пределах периода ожидания (в минутах, значение по умолчанию — 20 минут).
часы) без обновления или запроса веб-страницы, сеанс будет завершен. Вы можете использовать событие Session_OnEnd для выполнения некоторой работы по очистке.
Пример. В следующем примере показан часто используемый код события Session_OnEnd для подсчета количества людей в сети:
Sub Session_End (отправитель ByVal как объект, ByVal e как EventArgs)
Приложение("число пользователей") = Приложение("число пользователей") - 1
Конец субтитра