多个ajax获取相同路由但不同查询字符串的请求

时间:2012-02-10 07:57:02

标签: asp.net-mvc-3 jquery

我已经有几天了。

我有一个简单的搜索表单。提交表单时,服务器从另一个服务器搜索一些数据并将数据返回到屏幕。提交完成后,它会根据搜索返回的结果从服务器获取一些javascript。然后javascript向asp.net mvc3 webapp发出多个并发jquery get请求,比方说4。

我已经证明所有的get请求都会在Firebug中同时触发,但是在使用VS调试我的应用时,只有在前一个请求完成后才会触发断点。

行动是一样的但是查询是不同的;即

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

所以这些是不同的URL,从我发现的,FF应该以不同的方式对待它们。

所以我的问题是:

  1. 我错过了一些明显的东西吗?
  2. IIS是否在同一条路线上有一些有趣的阻止?
  3. 是会话缓存问题吗?我正在锁定lock (lockobject){}对常见会话变量的写入。
  4. 我没有使用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 个答案:

答案 0 :(得分:2)

在服务器端使用会话对象时,异步调用会等待其他请求释放的会话对象。因为这种异步ajax调用就像同步一样。您必须在该操作中将会话用作只读。

如果您不向会话写任何内容,请将此属性添加到您调用的操作中。

[SessionState(SessionStateBehavior.ReadOnly)]