IRequiresSessionState против IReadOnlySessionState
В чем разница между IRequiresSessionState
а также IReadOnlySessionState
кроме невозможности второго сохранить изменения в переменных сеанса?
Оба предоставляют мне возможность доступа к переменным сеанса в моем HttpHandler
, Но почему я предпочитаю IReadOnlySessionState
? Это просто ограничивает меня от сохранения сессии для следующего запроса.
Или это дает мне преимущество в производительности над IRequiresSessionState
?
Когда бы я предпочел использовать IReadOnlySessionState
над IRequiresSessionState
?
3 ответа
Одним из важных отличий является то, что IRequiresSessionState устанавливает исключительную блокировку для текущего сеанса, тем самым потенциально ограничивая количество одновременных запросов от текущего пользователя. (Дополнительные сведения об этом явлении блокировки см. В разделе Возможно ли принудительное выполнение параллелизма при использовании сеансов ASP.NET?)
Напротив, IReadOnlySessionState не получает эксклюзивную блокировку.
Это то же самое, что описано в полезном ответе Renad на почти идентичный вопрос 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
Этот интерфейс контролирует, будет ли каркас сохранять текущее состояние сеанса в конце запроса. Это имеет большее значение, когда вы используете внешнее хранилище состояния сеанса. В этом случае без интерфейса система все равно будет хранить данные сеанса в удаленной базе данных, даже если они не изменились (система не отслеживает, были ли данные сеанса изменены во время запроса). При использовании интерфейса IReadOnlySessionState фаза обратной записи пропускается.
Следуйте этому http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx
IRequiresSessionState является производным от System.Web.SessionState. С помощью этого интерфейса мы получаем доступ к сеансу в файле Httphandler и Class.
Если вам нужен доступ только для чтения к сеансу, реализуйте интерфейс IReadOnlySessionState.