4

我正在尝试使用 jQuery $.ajax 每 5 秒更新一次页面上的值,此代码过去可以正常工作,但在部署到生产服务器后,它似乎随机失败。在某些页面上它会起作用,而在其他页面上如果失败并出现错误:状态 0,状态文本:“错误”。

任何人都可以在代码/标记中发现任何用词不当的错误吗?

我用它每 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 控制器中的服务器代码(操作)如下所示:

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 OK 缓存控制:私有内容类型:应用程序/json;charset=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 请求,谷歌浏览器的控制台显示:

对象{readyState:0,getResponseHeader:函数,getAllResponseHeaders:函数,setRequestHeader:函数,overrideMimeType:函数...}

其中有 status:0 和 statusText: "error" 里面。而已。

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

编辑

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

谢谢,

4

2 回答 2

0

显式设置 text/json 如下

 return Json(new {
   UnreadMsgCount = unreadMessages
   //,UnreadMessages = unreadMessages
 }, 
 "text/json",
JsonRequestBehavior.AllowGet);
于 2013-11-13T15:06:03.443 回答
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);
                }
           });
        }
    }
于 2014-01-09T19:32:55.790 回答