IRequiresSessionState против IReadOnlySessionState - PullRequest
25 голосов
/ 07 ноября 2011

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

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

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

Ответы [ 3 ]

24 голосов
/ 20 сентября 2012

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

Напротив, IReadOnlySessionState не получает эксклюзивную блокировку.

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

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

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

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

  • EnableSessionState = False <-> нет I * SessionState интерфейс
  • EnableSessionState = True <-> Интерфейс IRequiresSessionState
  • EnableSessionState = ReadOnly <-> IReadOnlySessionState
7 голосов
/ 07 ноября 2011

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

1 голос
/ 07 ноября 2011

Подписаться http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx

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

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

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