0

我在页面上有多个 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”的方式是它只提供多个连接,该功能已经存在于现代浏览器中。IE 7 曾经有 2 个连接。

待处理的第一个 ajax 调用

这是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();
    }     
}
4

2 回答 2

2

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

解决它的最佳方法是简单地摆脱这个可怕的 ASP.NET 会话。以下是您可以在 web.config 中添加的内容,以确保项目中的任何开发人员都不会错误地使用它:

<system.web>
    <sessionState mode="Off" />
    ...
</system.web>
于 2013-02-19T22:20:41.513 回答
0

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

祝你好运!

于 2013-02-21T17:19:56.077 回答