Запросы jQuery Ajax отменяются без отправки - PullRequest
82 голосов
/ 28 сентября 2011

Я пытаюсь подключить скрипт к приложению Microsoft World-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 в этом случаеis "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 создает новый слой. Однако я не получаю обратный вызов. Если я добавляю обратный вызов ошибки, который вызывается, но свойство error в объекте jqXHR просто «ошибка», а состояние равно 0. ЕслиЯ смотрю на сетевой запрос в Chrome и вижу «(отменено)» как статус, а ответ отсутствует.

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

Конечно, отличаетсяЭто значит, что это ПОЛУЧЕНИЕ, а не ПОЧТА, но я попробовал это в своем сценарии, и это не имеет значения.

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

Ответы [ 17 ]

130 голосов
/ 14 мая 2012

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

107 голосов
/ 17 июля 2013

Если вы используете 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)
13 голосов
/ 05 ноября 2017

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

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

6 голосов
/ 31 октября 2011

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

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

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

4 голосов
/ 08 октября 2013

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

3 голосов
/ 26 апреля 2018

Расширяя ответ @ 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();
}
2 голосов
/ 04 марта 2016

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

2 голосов
/ 15 мая 2013

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

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

1 голос
/ 16 февраля 2013

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

0 голосов
/ 21 января 2019

Есть две возможности, когда 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...