由页面中的一个ajax调用引起的延迟问题

时间:2013-02-13 22:46:18

标签: javascript jquery asp.net ajax asp.net-mvc

我在页面上有多个ajax调用。为简洁起见,我们称它们为A,B,C。 “A”需要太长的时间,比如2分钟才能从服务器获取数据(我可以用2分钟)。然而,“B”& “C”响应时间以毫秒为单位。

出于某种原因,AJAX调用在“A”之后排队。即使IE 9可以同时为同一个域提供6个并发请求连接。您可以在下面的屏幕截图中看到并发连接。

“A”需要2分钟然后“B”& “C”进入待定状态,直到“A”完成。

我找到了“ajax_threads.js”http://cmarshall.net/MySoftware/ajax/Threads/,但我不知道这是否会有所帮助。我理解“ajax_threads.js”的方式是它只提供多个连接,这个功能已经存在于modren浏览器中。 IE 7过去常常有2个连接。

first ajax call pending

这是Javascript:

    $(function () {  $.ajax({
            type: "POST",
            url: "Service1.svc/GetDate",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            success: function (msg) {
                // Replace the div's content with the page method's return.
                $("#Result1").text(msg.d);
            }
        });


        $.ajax({
            type: "POST",
            url: "Service1.svc/GetDate2",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            success: function (msg) {
                // Replace the div's content with the page method's return.
                $("#Result2").text(msg.d);
            }
        });   }); 

HTML:

  <input type="button" id="Button1" value="1"/><div id="Result1"></div>
  <br/><input type="button" id="Button2" value="2"/><div id="Result2"></div>

服务器代码:(启用Ajax的WCF)

     [ServiceContract(Namespace = "")]
     [AspNetCompatibilityRequirements(RequirementsMode =  
     AspNetCompatibilityRequirementsMode.Allowed)]
     public class Service1
{
    [OperationContract]
    public string GetDate()
    {
        System.Threading.Thread.Sleep(8000);
        return DateTime.Now.ToString();
    }

    [OperationContract]
    public string GetDate2()
    {
        System.Threading.Thread.Sleep(1000);
        return DateTime.Now.ToString();
    }     
}

2 个答案:

答案 0 :(得分:2)

我打赌你在服务器上使用ASP.NET Session。使用Sessions时这是标准症状。其原因非常简单,源于ASP.NET Session的设计。它不是线程安全的。所以ASP.NET所做的只是锁定对它的访问。这样做的结果是您不能从同一个Session执行并行请求。它们将完全按照您观察它的方式排队。

解决它的最好方法是简单地摆脱这个可怕的ASP.NET Session。以下是您可以在web.config中添加的内容,以确保项目中没有开发人员犯下使用它的错误:

<system.web>
    <sessionState mode="Off" />
    ...
</system.web>

答案 1 :(得分:0)

没有简单的方法来处理这个问题。我在网上尝试了几个选项。但最好的解决方案是使用ASP.NET“ASP.NET WEBAPI”的新功能。

祝你好运!