MVC 4 $ Ajax JSON请求返回状态0,statusText:“error”

时间:2013-07-31 18:23:31

标签: ajax json asp.net-mvc-4

我正在尝试使用jQuery $ .ajax每5秒在我的页面上更新一个值,这段代码用于正常工作,但在部署到生产服务器后,它似乎是随机失败的。在某些页面上它会起作用,在其他页面上如果失败并出现错误:status 0,statusText:“error”。

任何人都可以发现代码/标记中的任何错误吗?

我每隔5秒就用它来调用我的方法:

setInterval(function () {
            updateMessages();
}, 5000);

updateMessages看起来像这样:

function updateMessages() {
    $.ajax({
       beforeSend: function () { },
       complete: function () { },
       type: "GET",
       url: '@Url.Action("GetUnreadMessagesJson", "Message", new { Area = "" })',
       contentType: "application/json; charset=utf-8",
       dataType: "json",
       success: function (result) {
           var newUnreadMessages = result.UnreadMsgCount;
       },
       error: function (rsult) {
           console.log(rsult);
       }
   });
}

MVC Controller中的我的服务器代码(Action)如下所示:

public ActionResult GetUnreadMessagesJson() {

   int unreadMessages = 0;
   try {
       unreadMessages = messageService.GetUnreadMessageCount(WebSecurity.CurrentUserId);
   }
   catch (Exception) {
       throw;
   }
   return Json(new {
       UnreadMsgCount = unreadMessages
       //,UnreadMessages = unreadMessages
   }, JsonRequestBehavior.AllowGet);
}

当我使用Fiddler2分析本地计算机上的请求时,我在响应中看到了这一点:

  

HTTP / 1.1 200好的   缓存控制:私有   Content-Type:application / json;字符集= utf-8的   服务器:Microsoft-IIS / 7.5   X-AspNetMvc-Version:4.0   X-AspNet-Version:4.0.30319   X-Powered-By:ASP.NET   日期:2013年7月31日星期三17:38:50 GMT   内容长度:20

{ “UnreadMsgCount”:3}

哪个看起来很好并且是我的期望,但是当网站上线时我从未看到过此请求。 Fiddler2从不显示任何传出的Ajax请求,谷歌Chrome控制台显示:

  

Object {readyState:0,getResponseHeader:function,getAllResponseHeaders:function,setRequestHeader:function,overrideMimeType:function ...}

其中有状态:0和statusText:“错误”里面。没什么。

如果我的代码没有任何问题,我该如何调查此问题?有没有人见过这个?

修改

在使用IE,Firefox和Safari等多种浏览器测试此问题后,问题似乎仅限于Google Chrome。我已提交错误报告here,并会根据我收到的任何回复更新此帖子。

谢谢,

2 个答案:

答案 0 :(得分:0)

显式设置text / json如下

 return Json(new {
   UnreadMsgCount = unreadMessages
   //,UnreadMessages = unreadMessages
 }, 
 "text/json",
JsonRequestBehavior.AllowGet);

答案 1 :(得分:0)

我最好的猜测是,当进行后续调用时,它正在取消之前的调用,使其返回状态为0.这可以解释为什么你有时会看到它,好像之前的调用完成然后下一个是发送后你就不会遇到问题了,所以任何减慢通话速度都会导致问题出现。

基于你的问题,我认为你不想中止之前的呼叫,因此一个选项是使呼叫同步,这样如果一个正在进行,就不要发送另一个。您将要保留对ajax调用的引用,如果它未完成,则不要发送另一个。类似的东西:

    var updateCall;

    function updateMessages() {
        if (updateCall && updateCall.readystate != 4){
            updateCall = $.ajax({
                beforeSend: function () { },
                complete: function () { },
                type: "GET",
                url: '@Url.Action("GetUnreadMessagesJson", "Message", new { Area = "" })',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (result) {
                    var newUnreadMessages = result.UnreadMsgCount;
                },
                error: function (rsult) {
                    console.log(rsult);
                }
           });
        }
    }