Подтвердить что ты не робот

IRequiresSessionState vs IReadOnlySessionState

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

  • Интерфейс EnableSessionState = False ↔ no я * SessionState
  • Интерфейс EnableSessionState = True ↔ IRequiresSessionState
  • EnableSessionState = ReadOnly ↔ IReadOnlySessionState

Ответ 2

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

Ответ 3

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

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

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