Las solicitudes de jQuery Ajax se cancelan sin ser enviadas

87

Estoy intentando conectar un script a la aplicación World-Wide Telescope de Microsoft. Este último escucha los comandos en el puerto 5050. Se ejecuta en la misma máquina que el navegador (Chrome en este momento, pero por lo que puedo decir, el comportamiento es el mismo con Firefox 7 e IE 9).

Estoy enviando un encabezado "Access-Control-Allow-Origin: *" con el archivo html original para intentar eliminar las restricciones XSS como mi problema.

Mi código para acceder a WWT es el siguiente:

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

url en este caso es "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ..." (obviamente ... es una abreviatura aquí para algunos parámetros adicionales).

Mirando los diagnósticos de red en Chrome, puedo ver esto:

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

La solicitud está saliendo. Veo que WWT crea una nueva capa. Sin embargo, no recibo una devolución de llamada. Si agrego una devolución de llamada de error que se llama, pero la propiedad de error en el objeto jqXHR es simplemente "error" y el estado es 0. Si miro la solicitud de red en Chrome, veo "(cancelado)" como el estado y no hay respuesta .

Si tomo esa misma URL y la pego en una nueva pestaña del navegador, puedo ver que la respuesta es el XML esperado.

Por supuesto, una diferencia aquí es que esto es un GET, no un POST, pero lo he intentado en mi script y no hace ninguna diferencia.

Estoy bastante perplejo por esto y agradecería cualquier idea nueva.

Graham Wheeler
fuente
¿Ha intentado manejar la errordevolución de llamada para ver si regresa con un error?
StriplingWarrior
1
"Estoy enviando un encabezado" Access-Control-Allow-Origin: * "con el archivo html original para intentar eliminar las restricciones XSS como mi problema". ¿Quiere decir que el servidor está devolviendo el encabezado Access-Control-Origin? ¿O que lo está enviando junto con la solicitud Ajax?
Jason Dean
intente acceder a la página directamente a través de la URL y vea si obtiene alguna salida
zod
1
Sí, recibo una devolución de llamada de error con el texto de estado "" y el código 0. Este no es un problema de jQuery; Reescribí el código usando un XHR directo y obtengo el mismo resultado, es decir, un readyState de 4 con un request.status de cero y un request.responseText vacío. El servidor envía el encabezado Access-Control-Allow-Origin. Acceder a la página directamente a través de la URL devuelve la respuesta XML esperada.
Graham Wheeler

Respuestas:

134

Si alguien más se encuentra con esto, el problema que tuvimos fue que estábamos haciendo la solicitud ajax desde un enlace y no evitando que se siguiera el enlace. Entonces, si está haciendo esto en un onclickatributo, asegúrese de hacerlo return false;también.

Kazetsukai
fuente
Esto también funcionó para mí. Gracias. Olvidé por qué estaba devolviendo falso en mi controlador onClick, y lo cambié a verdadero, y después de leer su publicación, de repente me di cuenta.
Shiprack
4
Además, si está utilizando un formulario, debe agregar return falseal final de su onsubmitatributo.
Jason Axelson
8
@VincentClyde "return false;"le dice a los formularios y enlaces que cancelen la acción. Esto fue originalmente diseñado para la validación de formularios de JavaScript, donde una función de validación devolvería falso si el formulario no era válido, lo que impedía que se enviara.
Tyzoid
13
También puede usar e.preventDefault();, donde ees el onclickparámetro de evento.
Hannele
1
@Hannele Muchas gracias por compartir event.preventDefault. Lo necesitaba tanto. No veo ninguna otra respuesta que sugiera esto. Debería publicar esto como una respuesta separada.
Mohit
112

Si está utilizando Chrome, no puede ver suficiente información en el panel de red estándar de Chrome para determinar la causa raíz de una (canceled)solicitud.

Debe usar el chrome://net-internals/#eventsque le mostrará los detalles sangrientos de la solicitud que está enviando, incluidos los redireccionamientos ocultos / información de seguridad sobre las cookies que se envían, etc.

Por ejemplo, lo siguiente muestra una redirección que no estaba viendo en el seguimiento de la red, debido a que mis cookies no se envían entre subdominios:

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)
Ben Walding
fuente
También tengo un problema (cancelado). @Ben, fue genial conocer este rastro, desafortunadamente no proporcionó ninguna información. El servidor en mi caso es S3 y cors está configurado en mi depósito. Todo lo que estoy haciendo es un simple GET para una imagen. Veo en un panel de red una solicitud con el encabezado Origin, pero no hay respuesta. Aparentemente, Chrome cancela la solicitud antes de enviarla al servidor. Sin redirecciones, sin https, sin contenido de longitud 0. Golpeándome la cabeza todo el día, sigue siendo un misterio.
Gene Vayngrib
@GeneVayngrib Pruebe Firefox: el depurador de red mostrará directamente más información; es posible que pueda resolver el problema allí y luego hacerlo funcionar en Chrome.
Ben Walding
@BenW gracias, pero Firefox no tiene ningún problema con esta imagen que se sirve desde Amazon S3.
Gene Vayngrib
YUPP. ¡Eso ayudó mucho!
rubmz
21

En mi caso, type='submit'cuando estaba enviando el formulario, la página se estaba recargando antes de que se activara el ajax, por lo que debía tener una solución simple type="button". Si no especifica un tipo, es submitde forma predeterminada, por lo que debe especificartype="button"

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

O

Sin tipo => type='button'

Mamba negro
fuente
3
necro publicando aquí, demándame stackoverflow. He estado buscando alto y bajo todo el día por qué mi solicitud funciona desde la consola pero no desde el script, y esta fue la respuesta ... ¡¡¡gracias !!!
pcort
1
Me conecté y encontré este hilo nuevamente para votar a favor de esta respuesta !!, esto ayudó mucho. me rompió la cabeza durante horas
dev
Jai shree krishna, espero que ayude a muchos por venir. Y se dan cuenta antes.
Black Mamba
6

Tuve un problema similar. En mi caso, estoy tratando de usar un servicio web en un servidor apache + django (el servicio fue escrito por mí mismo). Estaba teniendo el mismo resultado que tú: Chrome dice que se canceló mientras FF lo hace bien. Si intentara acceder al servicio directamente en el navegador en lugar de ajax, también funcionaría. Buscando en Google, descubrí que algunas versiones más nuevas de apache no estaban configurando la longitud de la respuesta correctamente en los encabezados de respuesta, así que hice esto manualmente. Con django, todo lo que tenía que hacer era:

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

Si tiene control sobre el servicio al que está intentando acceder, averigüe cómo modificar el encabezado de respuesta en la plataforma que está utilizando; de lo contrario, tendría que ponerse en contacto con el proveedor de servicios para solucionar este problema. Aparentemente, FF y muchos otros navegadores pueden manejar esta situación correctamente, pero los diseñadores de Chrome decidieron hacerlo según lo especificado.

Felipe Sodre Silva
fuente
Intenté configurar el encabezado de longitud del contenido y todavía tengo el mismo problema que se describe en la pregunta original. Estoy usando PHP 5.3.8 y Apache 2.2.21 (usando WAMP en Windows 7)
rodrigo-silveira
4

Tuve un problema similar. Usando chrome: // net-internals / # events pude ver que mi problema se debía a una redirección silenciosa. Mi solicitud de obtención se estaba disparando en un script de carga. La URL tenía el formato " http://example.com/inner-path " y el 301 redirigía permanentemente a "/ inner-path". Para solucionar el problema, acabo de cambiar la URL a "/ inner-path" y eso solucionó el problema. Todavía no sé por qué un guión que funcionó hace una semana de repente me estaba dando problemas ... Espero que esto ayude a alguien

RedOcho
fuente
3

(Usando formularios web ASP.NET)

Mi problema era que estaba tratando de disparar Ajax del evento de clic de un botón de envío que tenía una configuración de evento de clic del lado del servidor. Tuve que hacer que el botón sea solo un botón simple (es decir <input type="button">)

contactmatt
fuente
Muchas gracias.
Farheen Nilofer
3

Tuve el mismo problema, para mí estaba creando el iframe de manera temporal y estaba eliminando el iframe antes de que el ajax se completara, por lo que el navegador cancelaría mi solicitud de ajax.

Reza
fuente
¿Cómo resolvió este problema? Mi sitio se está incrustando en un iFrame que no estoy controlado por mí. Quiero que mi llamada se complete como lo hace con algunos ajustes de datos de fondo
Rips
@Rips esto es para hace 4 años, de todos modos creo que lo resolví usando Promesas
Reza
3

Ampliando la respuesta de @ Kazetsukai, puede encontrarse con este problema si está haciendo su solicitud AJAX desde el usuario que hace clic en un enlace.

Si configura su enlace así:

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

Y luego un controlador de JavaScript como el siguiente:

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

Para evitar que su navegador siga el enlace y cancele cualquier solicitud en curso, debe agregar return falseo e.preventDefault()detener la propagación del evento de clic:

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

O:

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

Hay dos posibilidades cuando se descarta la solicitud AJAX (si no es una solicitud de origen cruzado):

  1. No está impidiendo el comportamiento predeterminado del elemento para el evento.
  2. Estableció el tiempo de espera de AJAX demasiado bajo, o el servidor backend de la red / aplicación es lento.

Solución para 1) : agregue return false;o e.preventDefault();en el controlador de eventos.

Solución para 2) : agregue la opción de tiempo de espera mientras forma la solicitud AJAX. Ejemplo a continuación.

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

Para solicitudes de origen cruzado, marque los encabezados HTTP de intercambio de recursos de origen cruzado (CORS).

AnkitK
fuente
1

Recibí este error al realizar una solicitud usando http a una URL que requería https. Supongo que la llamada ajax no está manejando la redirección. Este es el caso incluso con la opción crossDomain ajax establecida en true (en JQuery 1.5.2).

ptutt
fuente
0

En mi caso, el mod-rewrite de I Apache coincidía con la url y redirigía la solicitud a https.

Mire la solicitud en chrome: // net-internals / # events.

Mostrará un registro interno de la solicitud. Compruebe si hay redireccionamientos.

bbrame
fuente
0

Tuve el mismo problema, pero en mi caso resultó ser un problema de cookies. Los chicos que trabajaban en el back-end habían cambiado la ruta de la cookie JSESSIONID que se establece cuando iniciamos sesión en nuestra aplicación, y yo tenía una cookie antigua con ese nombre en mi computadora, pero con la ruta anterior. Entonces, cuando intenté iniciar sesión en el navegador (Chrome), envié dos cookies llamadas JSESSIONID, con valores diferentes, al servidor, lo que comprensiblemente lo confundió, por lo que canceló la solicitud. Eliminar las cookies de mi computadora lo solucionó.

Joe Dyndale
fuente
0

Tuve este error de una manera más espeluznante: la pestaña de red y los eventos chrome: // net-internals / # no mostraron la solicitud después de que se completó el js. Al pausar js en el callcack de error, la pestaña de red mostró la solicitud como (cancelada). Se solicitó constantemente para exactamente una (siempre la misma) de varias solicitudes similares en una página web. ¡Después de reiniciar Chrome, el error no volvió a aparecer!

cristiano
fuente
0

Tuve el cancelado en Firefox . Algunas llamadas ajax funcionan perfectamente bien para mí, pero fallaron para el compañero de trabajo que realmente tuvo que usarlo.

Cuando comprobé esto a través de los trucos de Chrome mencionados anteriormente, no encontré nada sospechoso. Al verificarlo en Firebug, mostró la animación de 'cargando' después de las dos llamadas malévolas, y sin pestaña de resultados.

La solución fue mega simple: ir al historial, encontrar el sitio web, hacer clic derecho -> olvidar el sitio web.
Olvidar, no borrar.

Después de eso, ya no hay problemas. Supongo que tiene algo que ver con el .htaccess.

Martijn
fuente
0

En mi caso, fue la barra diagonal que faltaba en la URL. Agregar la barra diagonal resolvió mi problema.

Aftab Baig
fuente
0

Para el caso de Dropzone.js. En mi caso, se debió a que el valor de la timeoutopción era demasiado bajo de forma predeterminada. Así que auméntelo según sus necesidades.

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}
Scofield
fuente
-1

Tuve este problema con una red 3G en particular.
Siempre fallaría en las solicitudes DELETE con net_error = -101en chrome: // net-internals / # events.

Otras redes funcionaron bien, así que supongo que había un servidor proxy defectuoso o algo así.

Dan Abramov
fuente