ASP.NET
Состояние сеанса
Поиск…
Синтаксис
- Session ["Session_Key"] = Obj_Value;
замечания
HTTP не имеет статуса. Состояние сеанса ASP.NET - это структура, которая облегчает сохранение состояния между запросами HTTP-страниц.
Сессия отличается от переменных уровня класса своей способностью оставаться доступной через пост-спины и разные страницы. Например, переменная сеанса, созданная в Page1.aspx, будет доступна, если пользователь будет перенаправлен на страницу .aspx впоследствии в одном приложении.
Кроме того, в отличие от статических переменных, объявленных на уровне страницы, переменные сеанса независимы для разных пользователей. Значение, изменяющее значение переменной сеанса одного пользователя, не будет влиять на значение той же переменной для других пользователей.
Хотя ViewState
может использоваться для временного хранения данных пользователя, это не позволяет сохранять данные на нескольких страницах. Кроме того, viewstate
является частью страницы и отправляется клиенту. В результате любая критическая информация, связанная с пользователем, не может быть сохранена в ViewState
, и именно здесь переменные сеанса становятся полезными.
Использование объекта Session для хранения значений
Объект System.Web.SessionState.HttpSessionState
обеспечивает способ сохранения значений между HTTP-запросами. В приведенном ниже примере предпочтение пользователя к предупреждениям сохраняется в сеансе. Позже, выполняя другой запрос пользователю, приложение может прочитать это предпочтение из сеанса и скрыть предупреждения.
public partial class Default : System.Web.UI.Page
{
public void LoadPreferences(object sender, EventArgs args)
{
// ...
// ... A DB operation that loads the user's preferences.
// ...
// Store a value with the key showWarnings
HttpContext.Current.Session["showWarnings"] = false;
}
public void button2Clicked(object sender, EventArgs args)
{
// While processing another request, access this value.
bool showWarnings = (bool)HttpContext.Current.Session["showWarnings"];
lblWarnings.Visible = false;
}
}
Обратите внимание, что переменные сеанса не являются общими для всех пользователей (как и файлы cookie), и они сохраняются в нескольких экземплярах после обратной связи.
Сеанс работает, установив файл cookie, содержащий идентификатор сеанса пользователей. По умолчанию этот идентификатор хранится в памяти веб-сервера вместе со значениями, хранящимися в нем.
Вот скриншот файла cookie, установленного в браузере пользователя, чтобы отслеживать сеанс:
Использование хранилища сеансов SQL
Если вы обнаружите, что у вас несколько серверов, которым необходимо разделить состояние сеанса, их сохранение в памяти процесса ASP.NET не будет работать. Например, вы можете развертывать в среде веб-фермы с балансировщиком нагрузки, который распределяет запросы в циклическом режиме. В этой среде запросы одного пользователя могут обслуживаться несколькими серверами.
В файле web.config вы можете настроить хранилище сеансов SQL-сервера.
<configuration>
<system.web>
<sessionState
mode="SQLServer"
sqlConnectionString="Data Source=localhost;Integrated Security=SSPI"
cookieless="true"
timeout="30" />
</system.web>
</configuration>
Для создания схемы sql используйте инструмент aspnet_regsql. [SampleSqlServerName] - имя хоста SQL-сервера. -ssadd сообщает инструменту создать базу данных состояния сеанса. -sstype p указывает инструменту создать новую базу данных с именем ASPState по умолчанию.
aspnet_regsql.exe -S [SampleSqlServerName] -U [Username] -P [Password] -ssadd -sstype p
Использование магазина сеансов DynamoDB Amazon
Если вы не хотите использовать SQL-сервер, вы можете использовать размещенную Amazon базу данных Dynamo DB nosql в качестве хранилища сеансов.
Вам понадобится SDK AWS. Чтобы установить это из консоли диспетчера пакетов Visual Studio nuget, используйте следующую команду:
Install-Package AWSSDK
Затем вы можете настроить поставщика sessionState для использования настраиваемого поставщика. Вы должны указать регион и учетные данные, либо профиль, либо доступ к IAM, и комбинацию секретных ключей. По умолчанию это создаст таблицу с именем ASP.NET_SessionState.
<configuration>
<system.web>
<sessionState
timeout="20"
mode="Custom"
customProvider="DynamoDBSessionStoreProvider">
<providers>
<add name="DynamoDBSessionStoreProvider"
type="Amazon.SessionProvider.DynamoDBSessionStateStore"
AWSProfileName="[PROFILE]"
Region="[REGION]"
CreateIfNotExist="true"
/>
</providers>
</sessionState>
</system.web>
</configuration>