ASP.Net ReadOnly Session
Я провел следующий простой тест:
- В файле web.config мы имеем: `sessionState timeout=40 mode=InProc `
- Пустая страница с `EnableSessionState = "ReadOnly"`, установленной в теге страницы
- Код позади:
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, поэтому, возможно, этот параметр был изменен в другой файл конфигурации.