Сеанс только для чтения ASP.Net

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

  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/2019 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- Означает ли только чтение только чтение (значит, здесь есть ошибка в asp) или что-то еще?

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

Спасибо


person Ahmad Th    schedule 13.11.2014    source источник
comment
Просто столкнулся с таким же сценарием. Страница помечена как сеанс ReadOnly для ускорения запросов AJAX, и на этой странице можно изменить сеанс. Подтвердили ли вы в Microsoft, что это ошибка?   -  person Yuriy Galanter    schedule 13.11.2015
comment
@ DenisG.Labrecque это именно ссылка на этот вопрос!   -  person Ahmad Th    schedule 09.06.2020
comment
@AhmadTh Ой! Не уверен, на какой вопрос я хотел дать ссылку, но этот интересен: stackoverflow.com/questions/3629709/ Состояние сеанса ASPNET по-прежнему может быть записано даже в режиме только для чтения и не будет вызывать никаких исключений (оно просто не блокируется, чтобы гарантировать согласованность)   -  person Denis G. Labrecque    schedule 09.06.2020


Ответы (3)


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

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

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

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

Объявление точного использования состояния сеанса, которое будет выполнять каждая страница, - это способ оптимизировать производительность страницы, а также способ сохранить код в чистоте.

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

<sessionState mode="Off">

но я не думаю, что это то, что вам нужно.

person Gianpiero    schedule 13.11.2014
comment
Что касается MSDN, то то, что вы сказали о блокировках, очень верно. Однако, когда мы попробовали ту же конфигурацию с сеансом на основе SQL, режим ReadOnly привел к сеансу только для чтения. Любое изменение сеанса на странице с флагом ReadOnly будет просто проигнорировано. Итак, это подтверждает, что это ошибка: S - person Ahmad Th; 13.11.2014
comment
Это приятно! Я не знала этого - person Gianpiero; 13.11.2014

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

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

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

person Drak    schedule 07.02.2020

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

<sessionState mode="InProc" >

to

<sessionState mode="Off" >

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

person mmarjeh    schedule 13.11.2014
comment
Я не хочу отключать сеанс. Просто хочу знать о фактических последствиях установки только для чтения - person Ahmad Th; 13.11.2014