Эта статья будет интересна прежде всего тем, кто, явно или неявно, использует сессию ASP.NET в своих приложениях. Тем же, кто принципиально не использует сессию, можно почитать для общего развития – вдруг пригодится на будущее.

И, поверьте мне, она будет невероятно интересна разработчикам таких приложений, которые могут обрабатывать несколько небыстрых одновременных запросов от одного пользователя. Показательный пример – одновременное скачивание нескольких больших файлов. Это реальная проблема, с которой столкнулись мои коллеги и на отладку которой было потрачено неадекватно много времени.
Проблема состоит, в первую очередь, в неочевидности следующего факта:
в рамках одной сессии (одного SessionID) параллельные запросы выполняются по очереди, если обработчики поддерживают сессию.
При этом обращений к сессии в обработчике
может не быть вообще – важна только поддержка сессии и её предварительная инициализация.
В нашем примере это означает то, что пока не закачается один файл, закачивание других не начнется.
В принципе, ситуация с конкурентными запросами в рамках
одной сессии описана в статье MSDN
ASP.NET Session State Overview. Но есть нюансы. Во-первых, это один неприметный абзац в конце статьи (вместо выделенного блока в начале). Во-вторых, MSDN не раскрывает многих неочевидных моментов. И, что важно,
ни один из моих знакомых ASP.NET разработчиков не знал об этой особенности.
Заинтересовались? Тогда продолжаем. Я сформулирую несколько правил работы сессии и покажу на примере, что они верны.