JQuery Запросы Ajax отменяются без отправки

Я пытаюсь подключить script к Microsoft World-Wide Telescope. Последний прослушивает порт 5050 для команд. Он работает на той же машине, что и браузер (сейчас Chrome, но насколько я могу сказать, что поведение одинаково с Firefox 7 и IE 9).

Я отправляю заголовок "Access-Control-Allow-Origin: *" с исходным html файлом, чтобы попытаться устранить ограничения XSS в качестве моей проблемы.

Мой код для доступа к WWT выглядит следующим образом:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

url в этом случае является "http://127.0.0.1: 5050/layerApi.aspx? cmd = new &..." (очевидно... здесь приведены некоторые дополнительные параметры).

Глядя на диагностику сети в Chrome, я вижу это:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

Запрос выходит - я вижу, что WWT создает новый слой. Однако, я не получаю обратный вызов. Если я добавлю обратный вызов ошибки, который вызывается, но свойство ошибки на объекте jqXHR является просто "ошибкой", а статус равен 0. Если я посмотрю на сетевой запрос в Chrome, я вижу "(отменен)" как статус и отсутствие ответа.

Если я беру тот же URL-адрес и вставляю его в новую вкладку браузера, я вижу, что ответ представляет собой ожидаемый XML.

Конечно, разница в том, что это GET не POST, но я пробовал это в своем script, и это не имеет никакого значения.

Я очень взволнован этим и буду признателен за любые свежие идеи.

Ответы

Ответ 1

Если кто-то еще сталкивается с этим, проблема была в том, что мы делали запрос ajax из ссылки, а не препятствовали соблюдению ссылки. Поэтому, если вы делаете это в атрибуте onclick, убедитесь, что return false;.

Ответ 2

Если вы используете Chrome, вы не можете просмотреть достаточную информацию на стандартной сетевой панели Chrome, чтобы определить основную причину запроса (canceled).

Вам нужно использовать chrome://net-internals/#events, который покажет вам подробную информацию о отправляемом запросе, включая скрытые переадресации/информацию о безопасности, отправляемых и т.д.

например. следующее показывает перенаправление, которое я не видел в трассировке сети, вызванное тем, что мои файлы cookie не отправляются в кросс-поддомен:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)

Ответ 3

В моем случае у меня было type='submit' поэтому, когда я отправлял форму, страница перезагружалась до того, как был запущен ajax, поэтому простым решением было использование type="button"

type = 'submit' => type = 'button'

Ответ 4

У меня была аналогичная проблема. В моем случае я пытаюсь использовать веб-службу на сервере apache + django (служба была написана мною). У меня был тот же результат, что и вы: Chrome говорит, что он был отменен, а FF - в порядке. Если бы я попытался получить доступ к службе непосредственно в браузере вместо ajax, это сработало бы. Подойдя к нему, я узнал, что некоторые более поздние версии apache не задавали длину ответа правильно в заголовках ответов, поэтому я сделал это вручную. С django все, что мне нужно было сделать:

response['Content-Length'] = len(content)

Если у вас есть контроль над сервисом, к которому вы пытаетесь получить доступ, узнайте, как изменить заголовок ответа на используемой платформе, иначе вам придется обратиться к поставщику услуг, чтобы исправить эту проблему. По-видимому, FF и многие другие браузеры могут правильно обрабатывать эту ситуацию, но дизайнеры Chrome решили сделать это, как указано.

Ответ 5

У меня была аналогичная проблема. Используя chrome://net-internals/# events, я смог увидеть, что моя проблема связана с каким-то молчаливым перенаправлением. Мой запрос был запущен в onload script. URL-адрес был " http://example.com/inner-path", и 301 постоянно перенаправлялся на "/внутренний путь". Чтобы исправить проблему, я просто изменил URL-адрес на "/внутренний-путь" и устранил проблему. Я до сих пор не знаю, почему script, который работал неделю назад, внезапно дал мне вопрос... Надеюсь, это поможет кому-то.

Ответ 6

Расширяя ответ @Kazetsukai, вы можете столкнуться с этой проблемой, если делаете запрос AJAX от пользователя, нажимающего на ссылку.

Если вы настроили свою ссылку так:

<a href="#" onclick="soAjax()">click me!</a>

А затем обработчик JavaScript, как показано ниже:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

Чтобы ваш браузер не переходил по ссылке и не отменял любые выполняющиеся запросы, вы должны добавить return false или e.preventDefault() чтобы остановить распространение события click:

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

Или же:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}

Ответ 7

(Использование веб-форм ASP.NET)

Моя проблема заключалась в том, что я пытался отключить Ajax от события нажатия кнопки отправки, которая имела настройку события кликов на стороне сервера. Я должен был сделать кнопку простой кнопкой (т.е. <input type="button">)

Ответ 8

У меня была такая же проблема, для меня я создавал iframe для временного образа, и я удалял iframe до того, как ajax станет завершенным, поэтому браузер отменит мой запрос ajax.

Ответ 9

Я получил эту ошибку, когда делаю запрос с использованием http к URL-адресу, который требует https. Я думаю, что вызов ajax не обрабатывает перенаправление. Это имеет место, даже если для параметра crossDomain ajax установлено значение true (в JQuery 1.5.2).

Ответ 10

В моем случае, mod-rewrite Apache соответствовал URL-адресу и перенаправлял запрос на https.

Посмотрите на запрос в chrome://net-internals/# events.

Он покажет внутренний журнал запроса. Проверьте наличие перенаправления.

Ответ 11

У меня была та же проблема, но в моем случае это была проблема с файлом cookie. Ребята, работающие в фоновом режиме, изменили путь к файлу cookie JSESSIONID, установленному при входе в наше приложение, и на моем компьютере у меня был старый файл cookie, но со старым путем. Поэтому, когда я попытался войти в браузер (Chrome), на сервер были отправлены два файла с именем JSESSIONID с разными значениями, что, по понятным причинам, смутило его, поэтому он отменил запрос. Удаление файлов cookie с моего компьютера исправлено.

Ответ 12

У меня была эта ошибка более жутким образом: вкладка сети и события chrome://net-internals/# не отображали запрос после завершения js. При приостановке js в callcack ошибки вкладка сети отображала запрос как (отмененный). Он постоянно требовал ровно одного (всегда одного и того же) нескольких похожих запросов на веб-странице. После перезапуска Chrome ошибка снова не повышалась!

Ответ 13

У меня был отменен в Firefox. Некоторые ajax-звонки работают отлично для меня, но это не помогло сотруднику, который действительно должен был его использовать.

Когда я проверил это с помощью трюков Chrome, упомянутых выше, я не обнаружил ничего подозрительного. Проверяя его в firebug, он показывал анимацию "загрузки" после двух точных вызовов и без вкладки результатов.

Решение было очень простым: перейдите в историю, найдите веб-сайт, rightclick → забыли сайт.
Забудьте, а не удалите.

После этого больше нет проблем. Я предполагаю, что это имеет какое-то отношение к .htaccess.

Ответ 14

В моем случае это был недостающий конечный слэш в URL-адресе. Добавление конечной косой черты решает мою проблему.

Ответ 15

Для случая Dropzone.js. В моем случае это было вызвано тем, что значение параметра timeout было слишком низким по умолчанию. Так что увеличьте его своими потребностями.

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}

Ответ 16

Есть две возможности, когда AJAX-запрос отбрасывается (если не запрос Cross-Origin):

  1. Вы не запрещаете поведение элемента по умолчанию для события.
  2. Вы установили слишком малое время ожидания AJAX или медленный сервер сети/приложения.

Решение для 1): добавить return false; или e.preventDefault(); в обработчике событий.

Решение для 2): добавьте опцию тайм-аута при формировании запроса AJAX. Пример ниже.

$.ajax({
    type: 'POST',
    url: url,
    timeout: 86400,
    data: data,
    success: success,
    dataType: dataType
});

Для запросов перекрестного происхождения проверьте заголовки HTTP перекрестного общего доступа к ресурсам (CORS).

Ответ 17

У меня была эта проблема с конкретной сетью 3G.
Он всегда будет терпеть неудачу при запросах DELETE с net_error = -101 в chrome://net-internals/# events.

Другие сети работали нормально, поэтому я предполагаю, что был ошибочный прокси-сервер или что-то в этом роде.