но код выглядит подозрительно сложным только с целью снятия блокировки.
Это потому, что вы думаете об этом как о простой блокировке, которую кто-то добавил случайно или лень, а не как фактор, который рассматривался во всей концепции поставщика сеансов. Этот код выглядит достаточно простым для текущей задачи / замены всего существующего провайдера своим собственным / и при этом блокировка выполняется не так, как предполагалось.
Я предлагаю вам прочитать немного больше о том, как работает концепция сессии в asp.net. Учтите, что способ, которым он был разработан, предполагает чтение всего сеанса один раз в запросе, а затем запись измененного сеанса один раз.
Также обратите внимание, что, хотя это не ваш сценарий, код может зависеть от чтения отдельных значений сеанса для обработки чего-либо и может также записывать отдельные значения / индивидуальная блокировка может привести вас к тем же соображениям, которые могут привести к блокировке в базах данных.
Разработанный способ контрастирует с вашим намерением чтения / записи + блокировки, поскольку каждый отдельный элемент загружается / сохраняется.
Также обратите внимание, что вы можете обновлять значения объекта, который вы извлекли из сеанса, и не возвращать его обратно, но сеанс был обновлен. Насколько я знаю, провайдеры записывают все в сеансе назад в определенный момент жизненного цикла, поэтому не так просто, если вы хотите разделить блокировки чтения и записи на уровне элемента.
Наконец, если вы обнаружите высокий уровень сопротивления в модели поставщиков сеансов фреймворка и то, как вы намереваетесь изменить ее, вы не сможете использовать некоторые ее функции (например, переключение на провайдера различий, поскольку они будут иметь та же проблема); тогда я думаю, что вы должны просто держаться подальше от этого и свернуть свои собственные для ваших очень специфических потребностей. Это даже без использования asp.net Cache, так как вы хотите, чтобы это было по-вашему, вы контролируете время жизни и блокировки того, что там хранится.
Мне просто кажется, что вам нужен совсем другой механизм, поэтому я не вижу смысла в попытках изменить структуру для этого. Вы можете повторно использовать некоторые очень специфические фрагменты, такие как создание идентификатора сеанса и / или cookie вместо cookie-без, но кроме этого это другой зверь.