2013-11-01 66 views
4

我一直在整理这个问题整天,希望有人能帮助查明我的问题。我在我的应用程序中使用ajax创建了“异步进度回调”类型的功能。当我将功能剥离到测试应用程序中时,我可以得到理想的结果。见下图:Asp.Net MVC和ajax异步回调执行顺序

所需的功能 enter image description here

当我扎的功能到使用相同的代码,我得到一个种类的阻塞问题的所有请求的最后一个任务后,回应只是我的单页应用已完成。在上面的测试应用程序中,所有请求都按顺序进行响应。服务器报告所有请求的(“未决”)状态,直到控制器方法完成。任何人都可以给我一个暗示,可能会导致行为改变吗?

不希望 enter image description here

期望的Fiddler请求/响应

GET http://localhost:12028/task/status?_=1383333945335 HTTP/1.1 
X-ProgressBar-TaskId: 892183768 
Accept: */* 
X-Requested-With: XMLHttpRequest 
Referer: http://localhost:12028/ 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) 
Connection: Keep-Alive 
DNT: 1 
Host: localhost:12028 

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Vary: Accept-Encoding 
Server: Microsoft-IIS/8.0 
X-AspNetMvc-Version: 3.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcVEVNUFxQcm9ncmVzc0Jhclx0YXNrXHN0YXR1cw==?= 
X-Powered-By: ASP.NET 
Date: Fri, 01 Nov 2013 21:39:08 GMT 
Content-Length: 25 

Iteration completed... 

不希望的Fiddler请求/响应

GET http://localhost:60171/_Test/status?_=1383341766884 HTTP/1.1 
X-ProgressBar-TaskId: 838217998 
Accept: */* 
X-Requested-With: XMLHttpRequest 
Referer: http://localhost:60171/Report/Index 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) 
Connection: Keep-Alive 
DNT: 1 
Host: localhost:60171 
Pragma: no-cache 
Cookie: ASP.NET_SessionId=rjli2jb0wyjrgxjqjsicdhdi; AspxAutoDetectCookieSupport=1; TTREPORTS_1_0=CC2A501EF499F9F...; __RequestVerificationToken=6klOoK6lSXR51zCVaDNhuaF6Blual0l8_JH1QTW9W6L-3LroNbyi6WvN6qiqv-PjqpCy7oEmNnAd9s0UONASmBQhUu8aechFYq7EXKzu7WSybObivq46djrE1lvkm6hNXgeLNLYmV0ORmGJeLWDyvA2 


HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Vary: Accept-Encoding 
Server: Microsoft-IIS/8.0 
X-AspNetMvc-Version: 4.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcSUxlYXJuLlJlcG9ydHMuV2ViXHRydW5rXElMZWFybi5SZXBvcnRzLldlYlxfVGVzdFxzdGF0dXM=?= 
X-Powered-By: ASP.NET 
Date: Fri, 01 Nov 2013 21:37:48 GMT 
Content-Length: 25 

Iteration completed... 

除了授权令牌之外,两个请求头中的唯一区别是请求中的“Pragma:no-cache”以及响应中的asp.net版本。

感谢

更新 - 代码发布(我可能需要指明这个代码是源于一种article由迪诺·埃斯波西托)

var ilProgressWorker = function() { 
    var that = {}; 
    that._xhr = null; 
    that._taskId = 0; 
    that._timerId = 0; 
    that._progressUrl = ""; 
    that._abortUrl = ""; 
    that._interval = 500; 
    that._userDefinedProgressCallback = null; 
    that._taskCompletedCallback = null; 
    that._taskAbortedCallback = null; 
    that.createTaskId = function() { 
     var _minNumber = 100, 
      _maxNumber = 1000000000; 
     return _minNumber + Math.floor(Math.random() * _maxNumber); 
    }; 

    // Set progress callback 
    that.callback = function (userCallback, completedCallback, abortedCallback) { 
     that._userDefinedProgressCallback = userCallback; 
     that._taskCompletedCallback = completedCallback; 
     that._taskAbortedCallback = abortedCallback; 
     return this; 
    }; 

    // Set frequency of refresh 
    that.setInterval = function (interval) { 
     that._interval = interval; 
     return this; 
    }; 

    // Abort the operation 
    that.abort = function() { 
     //  if (_xhr !== null) 
     //   _xhr.abort(); 
     if (that._abortUrl != null && that._abortUrl != "") { 
      $.ajax({ 
       url: that._abortUrl, 
       cache: false, 
       headers: { 'X-ProgressBar-TaskId': that._taskId } 
      }); 
     } 
    }; 

    // INTERNAL FUNCTION 
    that._internalProgressCallback = function() { 
     that._timerId = window.setTimeout(that._internalProgressCallback, that._interval); 
     $.ajax({ 
      url: that._progressUrl, 
      cache: false, 
      headers: { 'X-ProgressBar-TaskId': that._taskId }, 
      success: function (status) { 
       if (that._userDefinedProgressCallback != null) 
        that._userDefinedProgressCallback(status); 
      }, 
      complete: function (data) { 
       var i=0; 
      }, 
     }); 
    }; 

    // Invoke the URL and monitor its progress 
    that.start = function (url, progressUrl, abortUrl) { 
     that._taskId = that.createTaskId(); 
     that._progressUrl = progressUrl; 
     that._abortUrl = abortUrl; 

     // Place the Ajax call 
     _xhr = $.ajax({ 
      url: url, 
      cache: false, 
      headers: { 'X-ProgressBar-TaskId': that._taskId }, 
      complete: function() { 
       if (_xhr.status != 0) return; 
       if (that._taskAbortedCallback != null) 
        that._taskAbortedCallback(); 
       that.end(); 
      }, 
      success: function (data) { 
       if (that._taskCompletedCallback != null) 
        that._taskCompletedCallback(data); 
       that.end(); 
      } 
     }); 

     // Start the progress callback (if any) 
     if (that._userDefinedProgressCallback == null || that._progressUrl === "") 
      return this; 
     that._timerId = window.setTimeout(that._internalProgressCallback, that._interval); 
    }; 

    // Finalize the task 
    that.end = function() { 
     that._taskId = 0; 
     window.clearTimeout(that._timerId); 
    } 

    return that; 
}; 

更新1 -非常感谢John Saunders。我能够找到this一篇文章,解释了约翰在他的关于序列化访问时评论中暗示

它块并行执行和力量平行请求而被执行了一个又一个,因为进入ASP.NET的会话状态是独占每会话

+0

你可以发布代码吗? –

+0

我敢打赌,您的AJAX调用的代码使用会话状态。 ASP.NET将序列化访问会话状态。 –

+0

非常感谢约翰!当我向测试客户端应用程序添加表单身份验证和会话状态时,我能够注意到与我的应用程序中相同的行为。 –

回答

1

我终于找到了一个修复程序。会话状态可以在Controller和/或Controller Method级别进行控制。由于授权正在更高级别进行验证,因此无需在我正在执行的操作中使用会话。我只是为了工作单位而禁用它。

[SessionState(SessionStateBehavior.Disabled)] 
public class _TestController : ProgressWorkerController