我正在尝试使用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,并会根据我收到的任何回复更新此帖子。
谢谢,
答案 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);
}
});
}
}