我已经有几天了。
我有一个简单的搜索表单。提交表单时,服务器从另一个服务器搜索一些数据并将数据返回到屏幕。提交完成后,它会根据搜索返回的结果从服务器获取一些javascript。然后javascript向asp.net mvc3 webapp发出多个并发jquery get请求,比方说4。
我已经证明所有的get请求都会在Firebug中同时触发,但是在使用VS调试我的应用时,只有在前一个请求完成后才会触发断点。
行动是一样的但是查询是不同的;即
/Home/Details/040801
/Home/Details/040802
/Home/Details/040803
所以这些是不同的URL,从我发现的,FF应该以不同的方式对待它们。
所以我的问题是:
lock (lockobject){}
对常见会话变量的写入。 我没有使用ViewBag或TempData。
页面加载时间,即使在会话中缓存了所有内容,仍然明显同步。
我的路线设置如下:
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);
}
答案 0 :(得分:2)
在服务器端使用会话对象时,异步调用会等待其他请求释放的会话对象。因为这种异步ajax调用就像同步一样。您必须在该操作中将会话用作只读。
如果您不向会话写任何内容,请将此属性添加到您调用的操作中。
[SessionState(SessionStateBehavior.ReadOnly)]