Ответ 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