2011-10-04 62 views
3

我有2個需要連接到第三個應用程序的MVC應用程序。導致問題的代碼在兩個MVC應用程序中都是相同的。

public bool UpdateServerData() 
    { 
      //string BASE_URL = "http://"; 
      string BASE_URL = "http://localhost:55094"; 
      string url = BASE_URL + "/Home/PullLiveData"; 
      WebRequest wr = WebRequest.Create(url); 
      wr.Credentials = CredentialCache.DefaultNetworkCredentials; // uses current windows user 
      var response = (HttpWebResponse)wr.GetResponse(); 
      return true; 
    } 

    public ActionResult GetServerUpdateProgress() 
    { 
      //string BASE_URL = "http://"; 
      string BASE_URL = "http://localhost:55094"; 
      string url = BASE_URL + "/Home/UpdateProgress"; 
      WebRequest wr = WebRequest.Create(url); 
      wr.Credentials = CredentialCache.DefaultNetworkCredentials; // uses current windows user 

      var myobj = new UpdateAJAXProgress(); 
      var response = (HttpWebResponse)wr.GetResponse(); 
      var reader = new StreamReader(response.GetResponseStream()); 
      JavaScriptSerializer js = new JavaScriptSerializer(); 
      var objText = reader.ReadToEnd(); 
      myobj = (UpdateAJAXProgress)js.Deserialize(objText, typeof(UpdateAJAXProgress)); 
      return Json(myobj); 
     } 

UpdateServerData通知localhost:55094刷新數據庫中的數據。 GetServerUpdateProgress返回進度計數/總數,以便我可以顯示數據庫刷新的進度條。

運行UpdateServerData的$就被設置爲異步工作:真正

然後用一個定時器,我跑每隔幾秒鐘GetServerUpdateProgress返回多遠沿着UpdateServerData是無法完成。

工作應用功能: enter image description here

不工作:

enter image description here

那麼出現在非工作版本中發生的是,它沒有運行GetServerUpdateProgress即使AJAX是調用在UpdateServerData完成之前,它實際上並沒有開始處理它裏面的任何東西。您可以看到ajax正在同步設置正確,因爲在非工作屏幕快照中都顯示加載動畫。我在GetServerUpdateProgress的開始處放置了一個斷點,它在UpdateServerData完成處理之後纔會觸發。

我主要關注的是一些環境下,或許在webconfig或Global.asax的,是不同的,這是什麼原因造成這兩個應用程序以不同的方式運行了一點。有任何想法嗎?

下面是一些相關的javascript:

function UpdateData() 
{ 
     $("#ChartUpdateProgressWhole").show(); 

    $.ajax({ 
     type: "POST", 
     async: true, 
     url: '@(Url.Action("UpdateServerData", "Charts"))', 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 
      Alert2({ 
       iconfilename: "tick.png", 
       text: "Database Updated!", 
       autohide: true, 
      }); 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 

     }, 
     complete:function (jqXHR, textStatus) { 
      $("#ChartUpdateProgressWhole").hide(); 
      timerStop = true; 
      LoadChart(); 
     }, 
    }); 

    if (!timerStop) { 
     CheckProgress(); 
     } 
} 
function CheckProgress() 
{ 
    if(timerStop) { 
     CheckProgressAjax(); 
     return; 
    } 
    window.setTimeout(CheckProgress, 2000); 
    CheckProgressAjax(); 
} 

function CheckProgressAjax() 
{ 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: '@(Url.Action("GetServerUpdateProgress", "Charts"))', 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 
      var width = (data.Completed * 100)/data.Total; 
      $("#ChartUpdateProgressPercent").css("width", width); 
     }, 
     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      alert(XMLHttpRequest.status); 
      alert(XMLHttpRequest.responseText); 
     } 
    }); 
} 

回答

3

隔空位在黑暗中刺在這裏,但ASP.NET將實際排隊異步請求,如果啓用會話狀態,以便處理它們(以避免必須處理同步問題)。

我的建議是如果可行的話,禁用會話狀態都在一起,如果這是不可能的,你可以使用以下屬性禁用每個控制器:

[SessionState(SessionStateBehavior.Disabled)] 
public class SomeController 
+1

也做到了,丹!謝謝!花了我一段時間,找出你有一個額外的行爲雖然:P – Robodude

+0

真棒:) :) 高興地幫助,那一個讓我難住了一段時間... 對不起,澳大利亞拼寫:P。現在修復。 –