ASP.Net ReadOnly Session

Я провел следующий простой тест:

  1. В файле web.config мы имеем: `sessionState timeout=40 mode=InProc `
  2. Пустая страница с `EnableSessionState = "ReadOnly"`, установленной в теге страницы
  3. Код позади:
protected void Page_Load(object sender, EventArgs e)
{

    if (Session["dt"] == null)
        Session["dt"] = DateTime.Now;

    Session["dt"] = ((DateTime)Session["dt"]).AddYears(1);
    Response.Write(Session["dt"].ToString());
}

Результат для параллельных постов будет следующим:

1-13.11.2015, 10:00:00
2- 13.11.2016 10:00:00
3- 13.11.2017, 10:00:00
4- 13/11/2018 10:00:00
5- 13.11.2009 10:00:00
6- 13.11.2020 10:00:00
...

Что ясно говорит о том, что переменная сеанса обновляется. В MSDN вы можете найти следующее: http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx

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

Мы выполняем операции чтения / записи практически на каждой странице нашего приложения. Однако это предотвращает одновременный запуск двух http-запросов для одного и того же клиента. Первый запрос должен быть завершен, пока сервер не обработает второй. После некоторых исследований это было очевидно из-за исключительных блокировок на сессии. Для любопытства мы попытались установить состояние сеанса на ReadOnly, и кажется, что все еще можно редактировать, без каких-либо исключительных блокировок.

Вопросы:

1- означает ли Readonly только чтение (так что здесь есть ошибка в asp) или это что-то еще?

2- Пока сеанс кажется редактируемым с состоянием ReadOnly, есть ли о чем беспокоиться, как вы думаете, безопасно ли продолжать использовать его таким образом в производственной среде?

Спасибо

2 ответа

Этот вопрос кажется старым, но имеет довольно много просмотров. Просто хотел предупредить людей, использующих состояния сеанса только для чтения и переключающихся с сеансов InProc на SQLServer.

Хотя вы все еще можете помещать данные в свой сеанс, когда он доступен только для чтения (без получения исключения), при использовании сеансов SQLServer эти изменения не фиксируются в базе данных, когда страница завершила свою работу.

Таким образом, на следующей странице не будут отображаться ваши изменения в сеансе, что может привести к странным побочным эффектам, если вы раньше использовали сеанс как InProc и ожидаете, что он увидит изменения.

Флаг ReadOnly указывает только ваше намерение для страницы / приложения. Это не защита для переменной Session.

Когда вы устанавливаете ReadOnly в объявлении страницы, вы просто заявляете, что страница не будет обновлять переменную Session. Но если тогда вы это сделаете, это на ваш страх и риск.

Объявление (и ваше поведение) помогает ASP.NET быть быстрее. Фактически, модуль состояния сеанса реализует механизм блокировки и ставит в очередь доступ к значениям состояния.

Страница, имеющая доступ к записи в состоянии сеанса, будет удерживать блокировку записи в сеансе до завершения запроса. Страница, имеющая доступ для чтения в состоянии сеанса, будет удерживать только блокировку чтения в сеансе до тех пор, пока запрос не завершится **.

Точное объявление об использовании состояния сеанса, которое собирается создать каждая страница, является способом оптимизации производительности страницы, а также способом поддержания чистоты кода.

Наконец, вы можете полностью отключить переменную Session (как чтение, так и запись), установив:

<sessionState mode="Off">

но я не думаю, что это то, что вы хотите.

Измените настройки сеанса:

<sessionState mode="InProc" >

в

<sessionState mode="Off" >

Я думаю, что вы вложили файл web.config, поэтому, возможно, этот параметр был изменен в другой файл конфигурации.

Другие вопросы по тегам