
Состояние сеанса
ASP.NET позволяет сохранять значения в состоянии сеанса, которые будут доступны всем страницам, запрошенным в этом сеансе веб-браузера. Также состояние сеанса пригодно для размещения информации, специфичной для пользователя, которую необходимо сохранить между циклами обмена данными и запросами страниц.
Состояние сеанса подобно состоянию приложения во всем, кроме области видимости: состояние сеанса доступно только в текущем сеансе браузера. Если с приложением работают несколько пользователей, у каждого из них будет свое состояние сеанса. Если пользователь закроет приложение либо вернется к нему после тайм-аута, информация из состояния прежнего сеанса будет потеряна и будет создано новое состояние сеанса.
Состояние сеанса хранится в виде пар «ключ — значение» объекта-словаря Session (экземпляр класса HttpSessionState). В эту структуру можно добавить информацию, специфичную для сеанса, чтобы сохранить ее между запросами страниц. После добавления такой информации в его состояние сервер будет обрабатывать ее без участия клиента, и состояние сеанса будет недоступно клиенту.
Состояние сеанса применяют для решения следующих задач:
уникальная идентификация браузеров и клиентских запросов и сопоставление их сеансам на сервере. Это позволяет отслеживать страницы вашего сайта, открытые пользователем в течение визита;
хранение на сервере данных, специфичных для сеанса и доступных в течение сеанса при многократных запросах браузеров и клиентских устройств. Это лучший способ хранения содержимого корзины покупателя;
генерация событий управления сеансом. Кроме того, эти события можно задействовать в коде приложения.
После добавления в состояние сеанса информации, специфичной для приложения, управление объектом состояния сеанса осуществляет сервер. Сеансовые данные могут храниться в cookie, на внешних серверах либо в БД SQL Server. Централизованное хранение состояния сеансов — лучший вариант, если клиентская часть веб-приложения функционирует на нескольких веб-серверах.
Чтение и запись состояния сеанса
Приведенный ниже пример кода демонстрирует запись времени последней загрузки страницы, а также последующее его извлечение и приведение к соответствующему типу. Этот код работает, подобно примеру с ViewState. Объект Session доступен для любой страницы, счетчик увеличивается независимо от способа перехода на другие страницы (щелчком кнопки возврата формы или ссылки), сам счетчик хранится на сервере, а не на клиенте:
//C#
// Проверить, существует ли объект Session, и показать результат
if (Session["lastVisit"] != null)
Label1.Text = ((DateTime)Session["lastVisit"]).ToString();
else
Label1.Text = "Session does not have last visit information.";
// Определить объект Session для следующего визита
Session["lastVisit"] = DateTime.Now;
Для отслеживания сеанса пользователя в ASP.NET используется cookie ASP.NETSessionId со случайным 24-байтовым значением. Хранящиеся в Session значения должны поддерживать сериализацию.
Отключение состояния сеанса
Если состояние сеанса не используется, можно повысить производительность, отключив его для всего приложения путем присваивания свойству sessionState mode в файле Web.config значения Off, как показано в следующем примере:
<configuration>
<system.web>
<sessionState mode="off"/>
</system.web>
</configuration>
Для отключения состояния сеанса на отдельной странице приложения установите страничную директиву EnableSessionState в False. Также можно присвоить директиве EnableSessionState значение ReadOnly, чтобы предоставить доступ только для чтения к сеансовым переменным. Отключение состояния сеанса для страницы иллюстрирует следующий пример:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableSessionState = "False"%>
Настройка состояния сеанса без cookie
По умолчанию состояние сеанса использует cookie для отслеживания сеансов пользователя. Это оптимальный выбор для большинства приложений. Почти все веб-браузеры поддерживают cookie, а для клиентов, не поддерживающих cookie, обычно не нужно отслеживать сеансовые данные (пример — агенты поисковых машин и другие роботы).
Тем не менее можно включить состояние сеансов без cookie (cookieless-сеансов), чтобы ASP.NET отслеживала сеансы через строки запроса в составе URL. ID сеанса внедряется в URL через слэш после имени приложения и предшествует идентификаторам файлов и виртуальных каталогов. Например, в следующий URL был модифицирован ASP.NET (вставлен уникальный ID сеанса — celit3py55t21z5v55vlm25s55):
http://www.example.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx
Ниже показан пример файла Web.confïg с настройками, позволяющими использовать в приложении ASP.NET идентификаторы для cookieless-сеансов.
<configuration>
<system.web>
<sessionState cookieless="true" regenerateExpiredSessionId="t rue" />
</system.web>
</configuration>
Обработка событий сеанса
ASP.NET поддерживает два события, применяемых для управления сеансами пользователя:
Session_Start
Генерируется при начале нового сеанса. Обработка этого события — отличный способ инициализации сеансовых переменных.
SessionEnd
Генерируется при завершении сеанса пользователем либо по истечении времени ожидания. Используется для освобождения ресурсов, занятых сеансом.
Для реализаций обработки этих событий добавьте файл Global.asax в проект и напишите код обработчиков, как показано в разделе «Обработка событий приложения».
Выбор режима состояния сеанса
Состояние сеанса ASP.NET поддерживает несколько способов хранения данных состояния, задающихся следующими параметрами:
InProc
Состояние сеанса хранится в памяти веб-сервера. InProc — параметр по умолчанию, так как более эффективен, чем служба состояния ASP.NET или хранение состояния в БД на сервере. InProc — отличный вариант для простых приложений. Но высоконадежные приложения, функционирующие на нескольких веб-серверах, которым необходимо сохранять сеансовые данные при перезапуске, должны использовать параметры StateServer или SQLServer.
StateServer
Состояние сеанса хранит ASP.NET-служба State Service. Оно гарантирует сохранность состояния сеанса при перезапуске веб-приложений, а также делает его доступным всем веб-серверам в составе веб-фермы. Служба состояния ASP NET работает на любом компьютере, обслуживающем веб-приложения ASP.NET. По умолчанию она запускается вручную. Поэтому при настройке службы состояния ASP.NET нужно назначить ей тип запуска Автоматически (Automatic).
SQLServer
Состояние сеанса хранится в базе данных SQL. Это гарантирует сохранность состояния сеанса при перезапуске веб-приложений, а также делает его доступным всем веб-серверам в составе веб-фермы. При равных возможностях оборудования служба состояния ASP.NET эффективнее хранения состояния в БД SQL Server, но последний вариант надежнее защищает целостность данных и поддерживает более широкие возможности отчетности.
Custom
Этот параметр указывает пользовательский метод хранения состояния. Для его применения необходимо реализовать собственный провайдер хранения состояния.
Off
Отключает состояние сеанса. Для повышения производительности приложения отключите состояние сеанса, если оно не используется.
Настройка режима Session State
Режим состояния сеанса ASP.NET задают, присваивая одно из значений перечислимого SessionStateMode атрибуту mode элемента sessionState в файле Web config приложения. Все режимы, кроме InProc и Off, требуют такие дополнительные параметры, как строки подключения. Узнать текущий режим состояния сеанса можно из свойства System.Web.SessionState.HttpSessionState.Mode.
Например, хранение состояния сеансов в базе данных SQL Server, заданной строкой подключения, определяют следующие параметры в Web.config:
<configuration>
<system.web>
<sessionState mode="SQLServer"
cookieless="true "
regenerateExpiredSessionId="true "
timeout="30"
sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
stateNetworkTimeout="30"/>
</system.web>
</configuration>
Настраивать состояние сеанса может и разработчик, но обычно это находится в компетенции системных администраторов. Например, системный администратор может исходно включить параметр InProc для вашего веб-приложения на одном из серверов. Если в дальнейшем возникнет перегрузка сервера либо потребуется избыточность, системный администратор сможет подключить второй веб-сервер и запустить службу состояния ASP.NET, установив в файле Web.config режим StateServer. К счастью, настройка режима состояния сеанса незаметна для приложения, поэтому изменять его код не требуется — достаточно внести необходимые изменения в файл Web.config.