2013-07-31 3 views
4

Я пытаюсь обновить значение на своей странице каждые 5 секунд, используя jQuery $ .ajax, этот код работал нормально, но после развертывания на производственном сервере он представляется случайным сбоем. На некоторых страницах он будет работать, а на других - если с ошибкой: 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 выглядит следующим образом:

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 Cache-Control: private Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNetMvc-Version: 4.0 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 31 Jul 2013 17:38:50 GMT Content-Length: 20

{ «UnreadMsgCount»: 3}

Что хорошо выглядит и то, что я ожидал, но я никогда не видел этот запрос, когда сайт находится под напряжением. Fiddler2 никогда не показывает никакого исходящего запрос Ajax, консоль Google Chrome показывает:

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

Который имеет статус: 0 и его статус: "ошибка" внутри. Больше ничего.

Как я могу рассказать об этой проблеме, если нет ничего плохого в моем коде? Кто-нибудь видел это раньше?

EDIT

После тестирования этого вопроса с несколькими браузерами, включая IE, Firefox и Safari кажется, что проблема ограничивается только Google Chrome. Я отправил отчет об ошибке here и обновит эту запись любым ответом, который я получаю.

Спасибо,

+0

Я также должен добавить на сайт в реальном времени. У меня есть фильтр для перенаправления HTTP-запросов на HTTPS. Я временно отключил это, но он не влияет на результаты. – Leigh

+0

есть ли разница в отображаемом URL? @url.Action («GetUnreadMessagesJson», «Message», new {Area = ""}) – Nenad

+0

@Nenad нет, при просмотре источника в моем браузере я вижу: url: '/ Message/GetUnreadMessagesJson' - который я скопировал и вставил в браузер адресная строка: www.domain.com/Message/GetUnreadMessagesJson - Я получаю ожидаемый результат - массив JSON, содержащий «UnreadMsgCount» – Leigh

ответ

0

Явное набор текста/JSON следующим

return Json(new { 
    UnreadMsgCount = unreadMessages 
    //,UnreadMessages = unreadMessages 
}, 
"text/json", 
JsonRequestBehavior.AllowGet); 
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); 
       } 
      }); 
     } 
    } 
Смежные вопросы