IRequiresSessionState против IReadOnlySessionState

В чем разница между IRequiresSessionState и IReadOnlySessionState помимо неспособности второго сохранить изменения в переменных сеанса?

Оба предоставляют мне возможность доступа к переменным сеанса в моем HttpHandler. Но почему я предпочитаю IReadOnlySessionState? Это просто не позволяет мне сохранять сеанс для следующего запроса.
Или это дает мне преимущество в производительности по сравнению с IRequiresSessionState?

Когда я предпочитаю использовать IReadOnlySessionState вместо IRequiresSessionState?


person Oleg Grishko    schedule 07.11.2011    source источник


Ответы (3)


Одним из важных отличий является то, что IRequiresSessionState устанавливает монопольную блокировку текущего сеанса, тем самым потенциально ограничивая количество одновременных запросов от текущего пользователя. (Для получения дополнительной информации об этом явлении блокировки см. Можно ли принудительно выполнить параллелизм запросов при использовании сеансов ASP.NET?)

Напротив, IReadOnlySessionState не получает монопольной блокировки.

Это то же самое, что описано в полезном ответе renad на почти идентичный вопрос SO.

Лучшая официальная документация, которую я нашел для этого, - из статьи MSDN Поставщики состояния сеанса :

Три наиболее важных метода в поставщике состояния сеанса - это GetItem, GetItemExclusive и SetAndReleaseItemExclusive. Первые два вызываются SessionStateModule для получения сеанса из источника данных. Если запрошенная страница реализует интерфейс IRequiresSessionState (по умолчанию все страницы реализуют IRequiresSessionState), обработчик события AcquireRequestState SessionStateModule вызывает метод GetItemExclusive поставщика состояния сеанса. Слово «Exclusive» в имени метода означает, что сеанс следует извлекать только в том случае, если он в настоящее время не используется другим запросом. Если, с другой стороны, запрошенная страница реализует интерфейс IReadOnlySessionState (наиболее распространенный способ добиться этого - включить атрибут EnableSessionState = "ReadOnly" в директиву @ Page), SessionStateModule вызывает метод поставщика GetItem. Никаких исключительных прав здесь не требуется, потому что перекрывающиеся доступы для чтения разрешены SessionStateModule.

Обратите внимание на параллель между явным использованием этих интерфейсов и использованием EnableSessionState Директива страницы:

  • EnableSessionState = False ‹-> нет Интерфейс I * SessionState
  • EnableSessionState = True ‹-> Интерфейс IRequiresSessionState
  • EnableSessionState = ReadOnly ‹-> IReadOnlySessionState
person Chris    schedule 19.09.2012
comment
+1 для блокировки - чрезвычайно важно, если веб-приложение может одновременно обрабатывать несколько асинхронных запросов, которые используют состояние сеанса. - person Tim Medora; 20.09.2012

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

person Carl Raymond    schedule 07.11.2011
comment
Откуда вы взяли эту информацию? можешь сослаться на ссылку? - person Royi Namir; 15.12.2011

Следуйте этому http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx

IRequiresSessionState является производным от System.Web.SessionState, используя этот интерфейс, мы получаем доступ к сеансу в Httphandler и файле класса.

Если вам нужен доступ только для чтения к сеансу, реализуйте интерфейс IReadOnlySessionState.

person coder    schedule 07.11.2011
comment
Да, я знаю, для чего используется IRequiresSessionState, но почему IReadOnlySessionState существует? Почему я предпочел бы его использовать? - person Oleg Grishko; 07.11.2011
comment
В PostMapRequestHandler HttpModule переключается с фактического обработчика на настраиваемый обработчик, который реализует IRequiresSessionState или IReadOnlySessionState, чтобы он мог использовать Seeion. В PreRequestHandlerExecute вы можете получить доступ к сеансу и при необходимости перенаправить. В PostAcquireRequestState вы переключаетесь обратно на исходный обработчик. - person coder; 07.11.2011