2013-11-01 67 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