2013-08-30 3 views
0

У меня есть веб-приложение, написанное в ASP.NET MVC 4. Клиентская сторона использует JQuery для выполнения запросов на сохранение и извлечение данных во время работы пользователя. В определенные моменты пользователь может изменить некоторые данные и щелкнуть по кнопке, чтобы сохранить ее. Для/производительность/требования ограничений архитектуры, этот процесс осуществляется в два этапа:JQuery ajax метод, возвращающий ошибку во время POST на Chrome

    запрос
  1. POST-отправляется на сервер для данного URL (который срабатывает определенное действие определенного контроллера), содержащего JSON объект;
  2. При первом успешном выполнении POST таймер настроен на запуск второго POST на тот же сервер, но другой URL (другое действие в том же контроллере), без содержимого вообще.

Второй POST только начнет комплементарный процесс и завершит начатое первым. Однако он никогда не получает сервер. Метод $ .ajax запускает обработчик ошибок.

Упрощенный вариант первого кода запроса является

$.ajax({ 
     url: self.opcoes.urlCreate, 
     type: "POST", 
     data: JSON.stringify(lancamento), 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     success: function (data) { 
      self.LancarDia(250); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      alert("Não foi possível incluir o lançamento. O servidor retornou\n" + 
          ajaxErrorMessage(jqXHR, textStatus, errorThrown)); 
     } 
}); 

Метод LancarDia() получает количество милисекунд, чтобы установить таймер для второго запроса, так что идея состоит в том, чтобы ждать 250 миллисекунд, а затем отправьте второй запрос. LancarDia() код:

MyClass.prototype.LancarDia = function (milisegundos) { 
    var self = this; 
    if (milisegundos) { 
     if (self.timerLancarDia) 
      clearTimeout(self.timerLancarDia); 
     self.timerLancarDia = setTimeout(function() { 
      self.LancarDia(); 
      self.timerLancarDia = undefined; 
     }, milisegundos); 
     return; 
    } 
    $.ajax({ 
     url: self.opcoes.urlLancarDia + self._dataAtual.format("MM/dd/yyyy"), 
     type: "POST", 
     success: function (data) { 
      if (self.opcoes.onLancou) 
       self.opcoes.onLancou(self._dataAtual); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      var mensagem = "Não foi possível atualizar o MUMPS. Motivo:\n" + 
          ajaxErrorMessage(jqXHR, textStatus, errorThrown); 
      alert(mensagem); 
     } 
    }); 
} 

Обратите внимание, что первый POST всегда работа и второй терпит неудачу много раз но не всегда. Когда это не удается, что я получаю:

  • jqXHR.status == 0
  • jqXHR.readystate == 0
  • textStatus == "ошибка"
  • errorThrown == ""

В своей первой версии код не использовал никаких таймеров. По успеху первого POST сразу же отправили второе. Сообщалось, что переход на текущую реализацию уменьшает частоту проблемы, но это все еще происходит.

Только Chrome показывает эту проблему, FireFox и IE работают чистыми.

Неужели кто-нибудь столкнулся и решил эту проблему?

Заранее спасибо

ответ

0

После долгого исследования сотрудники нашей инфраструктуры выяснили, что проблема была вызвана политикой кэширования браузера (Chrome) и политикой кэширования, настроенной на веб-сервере (IIS 7).

После настройки IIS для добавления нет кэша в заголовке ответа на кэш-контроля, проблема disapeared.

0

Вы упоминаете второй POST никогда не будет отправлен на сервер, как вы это проверка? Это больше похоже на состояние гонки, когда второй запрос отправляется до того, как сервер готов к нему (например, он все еще делает то, что было начато первым запросом).

+0

Это просто, я установил точку останова в действии сервера, и я вижу, что он никогда не попадает. Однако, когда проблема не возникает, точка останова попадает. Учитывая это, я не считаю, что это условие гонки, поскольку процесс в основном вставляет строку в таблицу сервера ddata в первом POST и удаляет ее во втором. – AlexSC

+0

Используете ли вы отладчик в браузере, например, средства разработки Firebug или Chrome? Они покажут вам, происходят ли ошибки в Javascript, а также показывают, что запрос отправляется – STW

Смежные вопросы