Несколько AJAX получают запросы одного и того же маршрута, но разные строки запроса - PullRequest
0 голосов
/ 10 февраля 2012

У меня было это в течение нескольких дней.

У меня есть простая форма поиска. Когда форма отправлена, сервер ищет некоторые данные с другого сервера и возвращает данные на экран. Когда отправка завершается, она получает некоторый javascript с сервера на основе результатов, полученных в результате поиска. Затем javascript отправляет несколько параллельных запросов на получение jquery, скажем, 4, в веб-приложение asp.net mvc3.

Я продемонстрировал, что все запросы get запускаются одновременно в Firebug, но при отладке моего приложения с VS точки останова попадают только после завершения предыдущего запроса.

Действия такие же, но запросы разные; т.е.

/Home/Details/040801
/Home/Details/040802
/Home/Details/040803

Так что это разные URL, и, как я выяснил, FF должен относиться к ним по-разному.

Итак, мои вопросы:

  1. Я что-то упускаю из виду?
  2. Есть ли у IIS забавные блокировки на том же маршруте?
  3. Это проблема с кэшем сеанса? Я блокирую 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);
    }

1 Ответ

2 голосов
/ 10 февраля 2012

при использовании объекта сеанса на стороне сервера ваши асинхронные вызовы ожидают объекта сеанса, освобожденного другим запросом. Из-за этого асинхронные вызовы ajax действуют как синхронизация. В этом действии вы должны использовать сеанс только для чтения.

Добавьте этот атрибут к действию, которое вы вызываете, если ничего не записываете в сессию.

[SessionState(SessionStateBehavior.ReadOnly)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...