Щойно я виявив, що кожен запит у веб-додатку ASP.Net отримує блокування сеансу на початку запиту, а потім випускає його в кінці запиту!
Якщо наслідки цього втрачаються на вас, як це було для мене спочатку, це в основному означає наступне:
Кожен раз, коли веб-сторінка ASP.Net потребує тривалого завантаження (можливо, через повільний дзвінок до бази даних чи що завгодно), і користувач вирішує, що хоче перейти на іншу сторінку, оскільки втомився чекати, НЕ МОЖЕ! Блокування сеансу ASP.Net змушує новий запит на сторінку чекати, поки початковий запит не закінчиться його болісно повільним завантаженням. Arrrgh.
Будь-який час UpdatePanel завантажується повільно, і користувач вирішує перейти на іншу сторінку, перш ніж UpdatePanel закінчить оновлення ... НЕ МОЖЕ! Блокування сеансу ASP.net змушує новий запит на сторінку чекати, поки оригінальний запит не закінчиться його болісно повільним завантаженням. Подвійний Арррх!
То які варіанти? Поки що я придумав:
- Реалізуйте власну SessionStateDataStore, яку підтримує ASP.Net. Я не знайшов занадто багато, щоб скопіювати це, і, здається, це щось з високим ризиком і легко зіпсувати.
- Слідкуйте за всіма запитами, що виконуються, і якщо запит надходить від того самого користувача, скасуйте оригінальний запит. Начебто екстремальний, але це би спрацювало (я думаю).
- Не використовуйте сесію! Коли мені потрібен якийсь стан для користувача, я можу просто використовувати кеш, а також ключові елементи автентифікованого імені користувача або щось подібне. Знову здається свого роду крайнім.
Я дійсно не можу повірити, що команда Microsoft ASP.Net залишила б таке величезне вузьке місце в рамках версії 4.0! Невже я пропускаю щось очевидне? Наскільки важко було б використовувати колекцію ThreadSafe для сесії?