Проблема:
Когда вы используете сеанс на сайте ASP.NET, он вызывает значительные задержки (кратные 500 мс) при загрузке нескольких запросов почти в одно и то же время.
Более конкретно, Моя проблема
Наш сайт использует сессию исключительно для своего SessionId. Мы используем этот ключ для поиска таблицы db с информацией о пользователе и т.д. Это казалось хорошим дизайном, поскольку оно хранило минимальные данные сеанса. К сожалению, SessionId изменится, если вы ничего не храните в сеансе, поэтому мы сохраняем Session["KeepId"] = 1;
. Этого достаточно, чтобы убедить SessionId не меняться.
На кажущейся несвязанной ноте сайт обслуживает настроенные изображения продукта посредством действия контроллера. Это действие генерирует изображение, если необходимо, затем перенаправляет на кешированное изображение. Это означает, что одна веб-страница может содержать изображения или другие ресурсы, отправляя десятки запросов через конвейер ASP.NET.
По какой-либо причине, когда вы (а) отправляете несколько запросов одновременно и (б), задействуете какой-либо сеанс, тогда вы получите случайные задержки 500 мс примерно на 1/2 времени. В некоторых случаях эти задержки будут составлять 1000 мс или более, всегда увеличиваясь с интервалом ~ 500 мс. Больше запросов означает более длительное время ожидания. На нашей странице с десятками изображений можно подождать 10+ секунд для некоторых изображений.
Как воспроизвести проблему:
- Создание пустого веб-приложения ASP.NET MVC
-
Создайте действие пустого контроллера:
public class HomeController : Controller { public ActionResult Test() { return new EmptyResult(); } }
-
Создайте страницу test.html с несколькими тегами img, которые попали в это действие:
<img src="Home/Test?1" /> <img src="Home/Test?2" /> <img src="Home/Test?3" /> <img src="Home/Test?4" />
-
Запустите страницу и посмотрите время быстрой загрузки в firebug:
-
Сделайте одно из следующих действий (оба имеют одинаковый результат):
-
Добавить пустой обработчик Session_Start в ваш файл Global.asax.cs
public void Session_Start() { }
-
Поместите что-нибудь в сеанс
public class HomeController : Controller { public ActionResult Test() { HttpContext.Current.Session["Test"] = 1; return new EmptyResult(); } }
-
-
Запустите страницу еще раз и обратите внимание на случайные/случайные задержки в ответах.
Что я знаю до сих пор
- Это происходит с MVC 2 и 3 и WebForms
- Это происходит с любым браузером (мы пробовали FF, Chrome, IE, Safari)
- Случается независимо от того, подключен ли отладчик. Кроме того, ничто не должно быть фактически сохранено в сеансе (см. Пример Session_Start выше).
- Это происходит с WebDev.exe, IIS Express и IIS
Мой вопрос
Как я могу использовать сеанс, но избегаю этих задержек? Кто-нибудь знает об исправлении?
Если нет исправления, я думаю, нам придется обойти сеанс и использовать файлы cookie напрямую (сеанс использует файлы cookie).