Я только что обнаружил, что каждый запрос в веб-приложении ASP.Net получает блокировку сеанса в начале запроса, а затем освобождает его в конце запроса!
В случае, если последствия этого потеряны для вас, как это было для меня вначале, это в основном означает следующее:
-
В любое время, когда веб-страница ASP.Net занимает много времени (может быть, из-за медленного вызова базы данных или чего-то еще), и пользователь решает, что они хотят перейти на другую страницу, потому что они устали ждать, ОНИ НЕ МОГУТ! Замок сеанса ASP.Net заставляет новый запрос страницы ждать, пока исходный запрос не завершит свою болезненную медленную нагрузку. Arrrgh.
-
В любое время, когда UpdatePanel медленно загружается, и пользователь решает перейти на другую страницу до того, как UpdatePanel завершит обновление... ОНИ НЕ МОГУТ! Замок сеанса ASP.net заставляет новый запрос страницы ждать, пока исходный запрос не завершит свою болезненную медленную нагрузку. Double Arrrgh!
Итак, каковы варианты? До сих пор я придумал:
- Внедрение пользовательского SessionStateDataStore, поддерживаемого ASP.Net. Я не нашел слишком много там, чтобы копировать, и это кажется очень рискованным и легким в заблуждение.
- Отслеживать все выполняемые запросы, и если запрос поступает от одного и того же пользователя, отмените исходный запрос. Кажется, это крайний, но он будет работать (я думаю).
- Не используйте Session! Когда мне нужно какое-то состояние для пользователя, я могу просто использовать кеш вместо этого и ключевые элементы аутентифицированного имени пользователя или что-то подобное. Опять же кажется крайним.
Я действительно не могу поверить, что команда ASP.Net Microsoft оставила бы такое огромное узкое место в инфраструктуре версии 4.0! Мне что-то не хватает? Насколько сложно было бы использовать коллекцию ThreadSafe для сеанса?