Конфликт блокировки сеанса со страницей только для чтения в режиме Inproc - PullRequest
4 голосов
/ 21 августа 2009

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

Вы все еще получаете преимущество отсутствия конкуренции за блокировку сеанса, когда страница настроена только на чтение и в режиме inproc? Придется ли нескольким одновременным запросам с одним и тем же идентификатором сеанса ждать, пока не будет снята блокировка сеанса в режиме только для чтения и в процессе?

Ответы [ 2 ]

6 голосов
/ 02 ноября 2012

Смотрите это сообщение в блоге: Обработка нескольких одновременных запросов от пользователя в ASP.NET :

  • enableSessionState="true" является поведением по умолчанию и получает блокировку записи для данных сеанса. Никакие другие читатели или писатели не могут получить доступ, пока удерживается эта блокировка.

  • enableSessionState="ReadOnly" получает блокировку чтения данных сеанса. Допускается одновременное использование нескольких считывателей, но ни один из них не может получить доступ, если какой-либо из них удерживает блокировку. К сожалению, любые изменения, которые вы вносите в сеанс, являются локальными для запроса и невидимы для других запросов, которые смотрят на объект сеанса. Если вы пытаетесь изменить сеанс «только для чтения», ошибка не выдается, поэтому это поведение не очевидно с первого взгляда.

  • enableSessionState="false" не получает блокировку. Свойство HttpContext.Session в конечном итоге становится нулевым, и ваша страница не будет иметь доступа к данным сеанса.

3 голосов
/ 22 августа 2009

BuzzAnn,

Документация Microsoft по этой теме указывает, что установка режима состояния сеанса на уровне страницы на «ReadOnly» должна защитить вас от одновременных попыток записи информации о состоянии сеанса (они будут поставлены в очередь и будут обрабатываться последовательно), но несколько читателей будут допущены. См. Раздел «Синхронизация доступа к состоянию сеанса»:

http://msdn.microsoft.com/en-us/library/aa479041.aspx

Когда для свойства EnableSessionState для страницы установлено значение «ReadOnly», каждый запрос страницы пытается получить блокировку чтения информации о состоянии. В стандартной семантике ReaderWriterLock любое количество читателей может иметь одновременный доступ к защищаемой информации. Любой запрос, который достигает блокировки записи (например, через EnableSessionState , установленный в значение «true»), тем не менее, блокирует записи и считывает информацию о состоянии сеанса до тех пор, пока запрос не удерживает программу записи. блокировка завершена.

Пока все, что вы пытаетесь сделать, это читать информацию о состоянии сеанса со своих страниц, пока для них EnableSessionState установлено значение "ReadOnly", все запросы на чтение будут выполняться без блокировки. Однако, если вы попытаетесь написать, в документации не ясно, что на самом деле произойдет. Предполагая, что ReaderWriterLock - это все, что используется для синхронизации доступа, я предполагаю, что вы не будете защищены от перезаписей, условий гонки и других проблем с несинхронизированным доступом.

Если вы собираетесь попытаться выполнить запись в состояние сеанса, обязательно установите для EnableSessionState значение «true», чтобы гарантировать, что блокировка устройства записи достигнута и синхронизация происходит по мере необходимости.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...