Одним из важных отличий является то, что 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