У меня было это в течение нескольких дней.
У меня есть простая форма поиска. Когда форма отправлена, сервер ищет некоторые данные с другого сервера и возвращает данные на экран. Когда отправка завершается, она получает некоторый javascript с сервера на основе результатов, полученных в результате поиска. Затем javascript отправляет несколько параллельных запросов на получение jquery, скажем, 4, в веб-приложение asp.net mvc3.
Я продемонстрировал, что все запросы get запускаются одновременно в Firebug, но при отладке моего приложения с VS точки останова попадают только после завершения предыдущего запроса.
Действия такие же, но запросы разные; т.е.
/Home/Details/040801
/Home/Details/040802
/Home/Details/040803
Так что это разные URL, и, как я выяснил, FF должен относиться к ним по-разному.
Итак, мои вопросы:
- Я что-то упускаю из виду?
- Есть ли у IIS забавные блокировки на том же маршруте?
- Это проблема с кэшем сеанса? Я блокирую
lock (lockobject){}
при записи в общие переменные сеанса.
Я не использую ViewBag или TempData.
Время загрузки страницы, даже когда все кэшируется в сеансе, все еще заметно синхронно.
- Windows Server 2008 R2
- Использование IIS 7.5
- ASP.NET MVC 3
- VS2010 Браузер Chrome или FF
Мои маршруты настроены следующим образом:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}", // URL with parameters
new { controller = "Home", action = "Index" } // Parameter defaults
);
routes.MapRoute("Details", "{controller}/{action}/{id}/{booking}", new { id = UrlParameter.Optional, booking = UrlParameter.Optional});
Ничего особенного, как вы можете видеть.
Пример кода с одного из заблокированных маршрутов:
public ActionResult Details(string id, bool booking = false)
{
if (booking)
{
return BookingDetails(id, true);
}
Dictionary<string, FlightDetails> detailDic;
string scenarioInput;
lock (DetailsLock)
{
if (Session["DetailDic"] == null)
{
Session["DetailDic"] = new Dictionary<string, FlightDetails>();
}
detailDic = (Dictionary<string, FlightDetails>)Session["DetailDic"];
}
if (detailDic.ContainsKey(id))
{
return PartialView("Details", detailDic[id]);
}
lock (GuidLock)
{
if (Session["DetailGuids"] == null)
{
Session["DetailGuids"] = new Dictionary<string, string>();
}
scenarioInput = ((Dictionary<string, string>)Session["DetailGuids"])[id];
}
// query results list
string queryText = string.Format("<View><Query><Where><Eq><FieldRef Name=\"Title\" /><Value Type=\"Text\">OUT {0}</Value></Eq></Where></Query></View>", scenarioInput);
ListItemCollection oList;
int counter = 0;
do
{
oList = SharepointHelper.GetListFromSharepoint("ListName", queryText, ClientContext);
counter++;
Thread.Sleep(1000);
} while (oList.Count == 0 && counter <= Timeout);
if (oList.Count == 0)
{
return PartialView("Details", (object)null);
}
var item = oList[0];
FlightDetails flightDetails = CreateFlightDetails(id, scenarioInput, item);
lock (DetailsLock)
{
detailDic.Add(id, flightDetails);
}
return PartialView("Details", flightDetails);
}