2014-11-13 3 views
5

Я провел следующий простой тест:ASP.Net ReadOnly Session

  1. В web.config, мы имеем: `таймаут = режим sessionState 40 = 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- ли Readonly означает Readonly (так что есть ошибка в жереха здесь) или что-то другое?

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

Благодаря

+0

Только что столкнулся с тем же сценарием. Страница, отмеченная сессией ReadOnly для ускорения запросов AJAX, а сеанс может быть изменен на этой странице. Вы подтвердили с Microsoft, что это ошибка? –

ответ

0

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

<sessionState mode="InProc" > 

к

<sessionState mode="Off" > 

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

+0

Я не хочу отключать сеанс. Просто хочу знать о «фактическом» влиянии установки его на чтение – Goldy

0

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

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

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

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

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

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

<sessionState mode="Off"> 

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

+1

Что касается MSDN, это очень верно, что вы сказали о блокировках. Однако, когда мы пробовали ту же конфигурацию с сеансом на основе SQL, режим ReadOnly привел к сеансу только для чтения. Любая модификация сеанса на странице с флажком ReadOnly будет просто проигнорирована. Таким образом, это подтверждает, что это ошибка: S – Goldy

+0

Это хорошо! Я этого не знал –