2011-10-04 64 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。现在修复。 –