jQuery Call to WebService devuelve el error "Sin transporte"

163

Tengo el siguiente servicio web;

    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }

Es un stock estándar sin alteraciones a los decoradores de clase.

Tengo este método jQuery;

var webMethod = "http://localhost:54473/Service1.asmx/HelloWorld"; 

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    data: "{}",  
    dataType: "json",
    url: webMethod,
    success: function(msg){ alert(msg.d); },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert(errorThrown);
          }
});

Es una acción de publicación porque más tarde necesito publicar datos en ella.

Cuando ejecuto jQuery, aparece el error "Sin transporte".

Una cosa que también debo mencionar es que jQuery está almacenado en un simple archivo HTML en mi máquina y el WebService también se está ejecutando en mi máquina.

No hay código detrás de la página HTML, es simplemente una página web y no un proyecto ac # ni nada.

¿Alguien puede señalarme en la dirección correcta aquí?

quejas
fuente
¿Puedes acceder a tu servicio web simplemente usando un navegador?
Avitus
Lo siento, no me di cuenta de que esta es una publicación diferente (edité esta publicación, pensando que era la mía), debo haber hecho clic en el hipervínculo a esta en mi propia publicación. Realmente lo siento por el dueño de la publicación = \
Erick Garcia
$ .support.cors = true; Si su punto final está habilitado para CORS (responde correctamente con un encabezado Access-Control-Allow-Origin, etc.), esta línea de código persuadirá a jQuery para que haga una solicitud de origen cruzado en IE8. Me encontré con esto antes, con la esperanza de que les ahorre algo de tiempo y dolor de cabeza.
Jeremy Hert

Respuestas:

95

Si su página jQuery no se está cargando, http://localhost:54473entonces este problema probablemente se deba a que está intentando realizar una solicitud entre dominios.

Actualización 1 Eche un vistazo a esta publicación de blog .

Actualización 2 Si este es realmente el problema (y sospecho que lo es), es posible que desee consultar JSONP como solución. Aquí hay algunos enlaces que pueden ayudarlo a comenzar:

no.good.at.coding
fuente
44
Sí, probablemente tenga algo que ver con la seguridad.
thenengah
3
No tiene que ser localhost: 54473, solo tiene que ser el mismo dominio.
jcolebrand
77
@drachenstern Hm, siempre he pensado (y parece recordar que siempre leí) que el esquema, el host y el puerto tenían que ser los mismos. Esto y esto y esto parecen apoyar mi forma de pensar acerca de lo que constituye el mismo dominio.
no.good.at.coding
@drachenstern Me alegro de ser de ayuda! Todo este material web es complicado: algo nuevo que aprender todos los días :)
no.good.at.coding el
1
@griegs Es bueno escucharlo, pero tenga en cuenta que en realidad no está resolviendo el problema; esto solo funcionará si el entorno permite solicitudes entre dominios, ya que solo está eliminando las salvaguardas que jQuery establece. Si su navegador no lo permite, configurar esta propiedad no hará nada por usted. Recomendaría hacer un poco de esfuerzo ahora para obtener JSONP en su lugar. Por lo menos, es posible que desee probar y ver si forzar la compatibilidad entre dominios de jQuery funciona con todos los navegadores que planea admitir. ¡Tampoco puedo comentar sobre qué otros problemas podrías encontrar más tarde!
no.good.at.coding
253

Agrega esto: jQuery.support.cors = true;

Permite secuencias de comandos entre sitios en jQuery (introducido después de 1.4x, creo).

Estábamos usando una versión muy antigua de jQuery (1.3.2) y la cambiamos por 1.6.1. Todo funcionaba, excepto las llamadas .ajax (). Agregar la línea anterior solucionó el problema.

SrBlanco
fuente
Un poco más de información aquí: blueonionsoftware.com/…
Andrew Arnott
14
Esto solucionó mi problema, funcionó en Chrome y Firefox pero no en IE. agregué esto a la parte superior de mi script y todo estuvo bien
Peter
@SrBlanco Esto también soluciona mi probem, gracias por compartir esta información.
dev
44
Muy buena solución, que tenía el mismo problema en Internet Explorer 9 cuando estaba solicitando un archivo KML desde el mismo dominio con una ruta relativa ... misterios de IE ...
Matteo Conta
Gracias. sí, mis llamadas de descanso se detuvieron después de 1.5 actualizaciones de jquery. Este código lo arregló.
ashraf
26

Tuve el mismo error en una página y agregué estas líneas:

<!--[if lte IE 9]>
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js'></script>
<![endif]-->

y finalmente funciona para mí;) no más errores en IE9.

bsuttor
fuente
66
Proyecto Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest y XDomainRequest información: blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Básicamente, IE8 e IE9 no admiten CORS en el objeto XMLHttpRequest. En su lugar, está obligado a utilizar el objeto XDomainRequest (que es más limitado. Puede leer la información en el segundo enlace).
richardaday
7

Ninguna de las respuestas propuestas funcionó completamente para mí. Mi caso de uso es ligeramente diferente (hacer que un ajax llegue a un archivo S3 .json en IE9). La configuración jQuery.support.cors = true;eliminó el No Transporterror, pero aún recibíaPermission denied errores.

Lo que funcionó para mí fue usar jQuery-ajaxTransport-XDomainRequest para forzar a IE9 a usar XDomainRequest. Para usar esto no fue necesario configurarjQuery.support.cors = true;

rynop
fuente
6

lo resuelvo usando dataType = 'jsonp' en el lugar de dataType = 'json'

Abhishek
fuente
2
Para su información, eso realmente no funcionaría para la solicitud del póster original, ya que jsonp no admite el verbo POST, solo GET.
Daniel Cox
tienes razón, lo usé para obtener feeds de fbwall, google +, etc. usando ajax
Abhishek
Todavía voy a dar un +1 porque me ayudó, gracias.
Manatherin
0

También tuve este problema y todas las soluciones dadas anteriormente fallaron o no fueron aplicables debido a las restricciones del servicio web del cliente.

Para esto, agregué un iframe en mi página que residía en el servidor del cliente. Entonces, cuando publicamos nuestros datos en el iframe y el iframe, los publicamos en el servicio web. Por lo tanto, se elimina la referencia entre dominios.

Agregamos una verificación de origen bidireccional para confirmar que solo los datos de publicaciones autorizadas de la página hacia y desde el iframe.

Espero eso ayude

<iframe style="display:none;" id='receiver' name="receiver" src="https://iframe-address-at-client-server">
 </iframe>

//send data to iframe
var hiddenFrame = document.getElementById('receiver').contentWindow;
hiddenFrame.postMessage(JSON.stringify(message), 'https://client-server-url');

//The iframe receives the data using the code:
window.onload = function () {
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    var eventer = window[eventMethod];
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
    eventer(messageEvent, function (e) {
        var origin = e.origin;
        //if origin not in pre-defined list, break and return
        var messageFromParent = JSON.parse(e.data);
        var json = messageFromParent.data;

        //send json to web service using AJAX   
        //return the response back to source
        e.source.postMessage(JSON.stringify(aJAXResponse), e.origin);
    }, false);
}
Riju Mahna
fuente
0

Para mí es una historia completamente diferente.
Como esta página tiene una buena clasificación en los motores de búsqueda, debo agregar mi caso y la solución aquí también.

Me construí jqueryconwebpack recogiendo sólo los módulos que uso. El ajax siempre falla con el mensaje "Sin transporte" como la única pista.

Después de una larga depuración, el problema resulta ser XMLHttpRequestconectablejquery y no incluye por defecto.

Debe incluir explícitamente el jquery/src/ajax/xhrarchivo para que el ajax funcione en los navegadores.

Sam curioso
fuente
-1

Lo resolví simplemente eliminando el dominio de la url de solicitud.

Before: https://some.domain.com/_vti_bin/service.svc

After: /_vti_bin/service.svc
Draghon
fuente
1
Sí, jQuery solicitud de ajax del mismo dominio donde el dominio no se especifica en la url. En mi caso, no necesitaba hacer una solicitud entre sitios y parece que tener el dominio en el parámetro url de la solicitud ajax hizo que la solicitud se comportara de alguna manera entre sitios. Mi entorno utiliza Microsoft ForeFront con algunas reglas de redireccionamiento y es posible que pueda estar causando los problemas.
Draghon
entonces ¿por qué estás respondiendo en cuestión respecto a la solicitud de dominio ajax cruz
Naeem Shaikh
1
@ NaeemShaikh27, la naturaleza de la solicitud (entre dominios versus el mismo dominio) no estaba clara en el OP; Estaba abordando la pregunta dados los parámetros "obvios" en la pregunta. De todos modos, solo digo "hey, recibí el mismo error, esto es lo que hice" y si te gustó o no (o si es apropiado para SO), funcionó para mí. Ahora, si vuelves y haces la pregunta más específica, entonces mi respuesta será completamente irrelevante.
Draghon