Общие сведения о состоянии сеанса ASP.NET

Обновлен: Ноябрь 2007

Состояние сеанса ASP.NET используется для хранения и извлечения значений сеанса пользователя.

В этом разделе рассматриваются следующие темы:

  • Базовые сведения

  • Примеры кода

  • Ссылка на классы

Базовые сведения

Состояние сеанса ASP.NET позволяет сохранять и извлекать значения для пользователя, когда пользователь переходит на другие страницы ASP.NET веб-приложения. Протокол HTTP не имеет состояний. Это означает, что веб-сервер обрабатывает каждый HTTP-запрос страницы независимо. Сервер не сохраняет данные о значениях переменных, использованных в предшествующих запросах. Состояние сеанса ASP.NET определяет запросы, полученные от браузера в течение ограниченного периода времени (сеанса) и предоставляет возможность сохранения значений переменных в течение этого сеанса. По умолчанию состояние сеанса ASP.NET включено для всех приложений ASP.NET.

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

  • Состояние приложения, хранящее переменные, к которым могут обращаться все пользователи приложения ASP.NET.

  • Свойства профиля, бессрочно хранящего значения пользователя в хранилище данных.

  • Кэш ASP.NET, хранящий значения в памяти, доступной для приложений ASP.NET.

  • Состояние представления, хранящее значения на странице.

  • Файлы Сookie.

  • Строка запроса и поля на форме HTML, доступные из HTTP-запроса.

Сравнение различных вариантов управления состоянием см. в разделе Рекомендации по управлению состоянием ASP.NET.

Переменные сеанса

Переменные сеанса хранятся в объекте SessionStateItemCollection, доступного через свойство HttpContext.Session. На странице ASP.NET доступ к переменным текущего сеанса можно получить при помощи свойства Session объекта Page.

Коллекция переменных сеанса индексирована по имени переменной или целочисленному индексу. Переменные сеанса создаются при ссылке на переменную по имени. Нет необходимости объявлять переменную сеанса или явно добавлять ее в коллекцию. В следующем примере кода создаются переменные сеанса на странице ASP.NET для имени и фамилии пользователя, им присваиваются значения, извлеченные из элемента управления TextBox.

Session("FirstName") = FirstNameTextBox.Text
Session("LastName") = LastNameTextBox.Text
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

В качестве типа переменных сеанса может быть использован любой допустимый тип .NET Framework. В следующем примере объект ArrayList сохраняется в переменной сеанса с именем StockPicks. Значение, возвращаемое переменной сеанса StockPicks, необходимо привести к соответствующему типу при его извлечении из коллекции SessionStateItemCollection.

' When retrieving an object from session state, cast it to 
' the appropriate type.
Dim stockPicks As ArrayList = CType(Session("StockPicks"), ArrayList)

' Write the modified stock picks list back to session state.
Session("StockPicks") = stockPicks
// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
ms178581.alert_note(ru-ru,VS.90).gifПримечание.

При использовании режима состояния сеанса, отличного от InProc, тип переменной сеанса должен быть типом .NET или сериализуемым типом. Это вызвано тем, что значение переменной сеанса хранится во внешнем хранилище данных. Дополнительные сведения см. в разделе Режимы состояний сеанса.

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

Сеансы определяются с помощью уникального идентификатора, который можно получить при помощи свойства SessionID. Если для приложения ASP.NET включено состояние сеанса, во всех запросах страницы в приложении рассматривается значение SessionID, полученное от обозревателя. Если значения идентификатора SessionID нет, ASP.NET запускает новый сеанс, и значение идентификатора SessionID этого сеанса передается обозревателю при ответе.

По умолчанию значения SessionID хранятся в файле Cookie. Однако можно настроить приложение таким образом, чтобы хранить значения SessionID в URL-адресе для сеансов без поддержки файлов Cookie.

Сеанс считается активным, пока запросы выполняются с одинаковым значением идентификатора SessionID. Если время между запросами определенного сеанса превышает указанное время ожидания в минутах, сеанс считается недействительным. Запросы, выполненные с просроченным идентификатором SessionID, приводят к запуску нового сеанса.

ms178581.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Значения P:System.Web.SessionState.HttpSessionState.SessionID передаются как текст в качестве файла Cookie или как часть URL-адреса. Пользователь-злоумышленник может получить доступ к сеансу другого пользователя, узнав значение идентификатора SessionID и включив его в запросы к серверу. Для хранения конфиденциальных сведений в состоянии сеанса рекомендуется использовать SSL для шифрования любого обмена данными между обозревателем и сервером, включая значение SessionID.

Значение SessionID по умолчанию хранится в бессрочном файле Cookie сеанса в обозревателе. Однако можно отменить сохранение идентификаторов сеанса в файле Cookie, если присвоить атрибуту cookieless значение true в разделе sessionState файла Web.config.

В следующем примере показан файл Web.config, который настраивает приложение ASP.NET для использования идентификатора сеанса без файлов Cookie.

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

Среда ASP.NET поддерживает состояние сеансов без объектов Cookie, автоматически вставляя уникальный идентификатор сеанса в URL-адрес страницы. Например, в следующий URL-адрес средствами ASP.NET был добавлен уникальный идентификатор сеанса lit3py55t21z5v55vlm25s55:

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

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

Идентификатор сеанса внедряется в URL-адрес после косой черты (/), следующей за именем приложения, и перед любым оставшимся идентификатором файла или виртуального каталога. Это позволяет ASP.NET обрабатывать имя приложения до включения объекта SessionStateModule в запрос.

ms178581.alert_note(ru-ru,VS.90).gifПримечание.

Для повышения безопасности приложения следует разрешать пользователям выходить из приложения, при этом приложение должно вызывать метод Abandon. Это уменьшает вероятность того, что пользователь-злоумышленник воспользуется уникальным идентификатором в URL-адресе для извлечения личных данных пользователя, которые хранятся в сеансе.

Повторное создание просроченных идентификаторов сеансов

Значения идентификатора сеанса, используемые в сеансах без файлов Cookie, создаются повторно по умолчанию. То есть, при поступлении запроса с просроченным идентификатором сеанса, запускается новый сеанс с предоставленным в этом запросе идентификатором SessionID. Это может привести к нежелательному совместному использованию данных, когда ссылка, содержащая идентификатор SessionID без файлов Cookie, используется совместно несколькими веб-обозревателями. (Это может произойти, если ссылка передается в поисковый двигатель при помощи сообщения электронной почты или другой программы.) Вероятность совместного использования данных несколькими клиентами можно сократить, отключив повторное использование идентификаторов сеанса. Для этого нужно присвоить атрибуту regenerateExpiredSessionId элемента конфигурации SessionState значение true. В результате при запросе сеанса без файлов Cookie с просроченным идентификатором сеанса создается новый идентификатор сеанса.

ms178581.alert_note(ru-ru,VS.90).gifПримечание.

При поступлении запроса с просроченным идентификатором сеанса, созданного при помощи HTML-метода POST, любые переданные данные теряются, если значение regenerateExpiredSessionId равно true. Это происходит из-за того, что ASP.NET перенаправляет запрос, чтобы у обозревателя в URL-адресе был идентификатор сеанса.

Пользовательские идентификаторы сеанса

Можно реализовать пользовательский класс для предоставления и проверки значений идентификатора SessionID. Для этого следует создать класс, наследующий класс SessionIDManager, и переопределить методы CreateSessionID и Validate. Пример см. в описании метода CreateSessionID.

Можно заменить класс SessionIDManager, создав класс, реализующий интерфейс ISessionIDManager. Например, есть веб-приложение, которое связывает уникальный идентификатор с не-ASP.NET страницами, такими как HTML-страницы или изображения с использованием фильтра ISAPI. Можно реализовать пользовательский класс SessionIDManager, для использования этого уникального идентификатора с состоянием сеанса ASP.NET. Если пользовательский класс поддерживает идентификаторы сеансов без файлов Cookie, необходимо реализовать решение для отправки и получения идентификаторов сеансов в URL-адресе.

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

Состояние сеанса ASP.NET поддерживает несколько различных параметров хранения переменных сеанса. Каждый параметр определяется как тип состояния сеанса Mode. По умолчанию переменные сеанса хранятся в памяти рабочего процесса ASP.NET. Однако состояние сеанса можно также хранить в отдельном процессе, в базе данных SQL Server или пользовательском источнике данных. Если использование состояния сеанса для приложения не требуется, можно перейти в режим сеанса Off.

Дополнительные сведения см. в разделе Режимы состояний сеанса.

События сеанса

ASP.NET предоставляет два сеанса, помогающих управлять пользовательскими сеансами. Событие Session_OnStart возникает при запуске нового сеанса, а событие Session_OnEnd возникает, когда сеанс завершается или срока действия сеанса истекает. События сеанса указываются в файле Global.asax для приложения ASP.NET.

Событие Session_OnEnd не поддерживается, если значение свойства сеанса Mode отличается от InProc, что является режимом по умолчанию.

ms178581.alert_note(ru-ru,VS.90).gifПримечание.

Если файл Global.asax или Web.config для приложения ASP.NET изменяется, приложение перезапускается и все значения, сохраненные в состоянии приложения или сеанса, теряются. Учтите, что некоторые антивирусные программы могут изменять дату и время последнего изменения файла Global.asax или файла Web.config приложения.

Дополнительные сведения см. в разделе События состояния сеанса.

Настройка состояния сеанса

Состояние сеанса настраивается при помощи элемента sessionState раздела конфигурации system.web. Кроме того, состояние сеанса можно настроить, используя значение EnableSessionState в директиве @ Page.

Элемент sessionState позволяет указывать следующие параметры.

  • Режим, в котором сеанс хранит данные.

  • Метод передачи идентификаторов сеанса между клиентом и сервером.

  • Значение сеанса Timeout.

  • Поддержка значений на основе параметра сеанса Mode.

В следующем примере показан элемент sessionState, настраивающий приложение для использования режима сеанса SQLServer. Параметру Timeout присваивается значение 30 минут, а идентификаторы сеанса хранятся в URL-адресе.

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

Состояние сеанса для приложения можно отключить, установив режим состояния сеанса Off. Чтобы отключить состояние сеанса для отдельной страницы приложения, следует присвоить параметру EnableSessionState в директиве @ Page значение false. Параметру EnableSessionState можно присвоить значение ReadOnly , чтобы переменные сеанса были доступны только для чтения.

Параллельные запросы и состояние сеанса

Доступ к состоянию сеанса ASP.NET эксклюзивен для одного сеанса, что означает, что если два разных пользователя выполняют параллельные запросы, доступ к отдельным сеансам предоставляется параллельно. Но если два параллельных запроса выполняются для одного сеанса (с использованием одного значения идентификатора SessionID), первый запрос получает эксклюзивный доступ к данным сеанса. Второй запрос выполняется только после выполнения первого запроса. (Второй сеанс также может получить доступ, если монопольная блокировка данных отключается, так как время ожидания первого запроса превысило время ожидания блокировки.) Если значение идентификатора EnableSessionState в директиве @ Page равно ReadOnly, запрос данных, доступных только для чтения, не вызовет монопольную блокировку данных сеанса. Однако запросы данных, доступных только для чтения, могут ожидать снятия блокировки, установленной запросом чтения и записи данных сеанса.

К началу

Примеры кода

Практическое руководство. Сохранение значений состояния сеанса

Практическое руководство. Чтение значения из состояния сеанса

Реализация поставщика хранилища состояний сеансов

К началу

Ссылка на классы

В следующей таблице перечислены ключевые классы, связанные с состоянием сеанса в пространстве имен System.Web.SessionState.

Член

Описание

SessionIDManager

Осуществляет управление уникальными идентификаторами для состояния сеанса ASP.NET.

SessionStateItemCollection

Используется для хранения переменных сеанса.

К началу

См. также

Основные понятия

Реализация поставщика хранилища состояний сеансов