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