web-dev-qa-db-fra.com

L'appel au service Web jQuery renvoie l'erreur "Pas de transport"

J'ai le service Web suivant;

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

Il s'agit d'une norme de stock sans aucune modification des décorateurs de classe.

J'ai cette méthode 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);
          }
});

C'est une action post parce que plus tard, j'ai besoin d'y poster des données.

Lorsque j'exécute jQuery, l'erreur "Aucun transport" est renvoyée.

Une chose que je devrais également mentionner est que jQuery est stocké dans un simple fichier HTML sur ma machine et que le WebService s'exécute également sur ma machine.

Il n'y a pas de code en retard sur la page HTML, c'est simplement une page Web et non un projet c # ou quoi que ce soit.

Est-ce que quelqu'un peut me diriger dans la bonne direction?

163
griegs

Si votre page jQuery n'est pas chargée à partir de http://localhost:54473, ce problème est probablement dû au fait que vous essayez d'effectuer une requête interdomaine.

Mise à jour 1 Jetez un coup d'œil à cet article de blog .

Mise à jour 2 Si tel est effectivement le problème (et je suppose que c'est le cas), vous voudrez peut-être essayer JSONP comme solution. Voici quelques liens qui pourraient vous aider à démarrer:

95

Ajoutez ceci: jQuery.support.cors = true;

Il permet la création de scripts intersites dans jQuery (introduit après la version 1.4x, je crois).

Nous utilisions une très ancienne version de jQuery (1.3.2) et l’avions remplacée par la version 1.6.1. Tout fonctionnait, sauf les appels .ajax (). L'ajout de la ligne ci-dessus a résolu le problème.

252
SrBlanco

J'ai eu la même erreur sur une page, et j'ai ajouté ces lignes:

<!--[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]-->

et ça marche enfin pour moi;) plus d’erreur dans IE9.

26
bsuttor

Aucune des réponses proposées n'a complètement fonctionné pour moi. Mon cas d'utilisation est légèrement différent (faire un ajax arriver à un fichier S3 .json dans IE9). Le paramétrage de jQuery.support.cors = true; supprime l'erreur No Transport mais je continue à obtenir des erreurs Permission denied.

Ce qui a fonctionné pour moi a été d’utiliser jQuery-ajaxTransport-XDomainRequest pour forcer IE9 à utiliser XDomainRequest. L'utilisation de cette opération n'a pas nécessité la configuration de jQuery.support.cors = true;

7
rynop

je le résous en utilisant dataType = 'jsonp' à la place de dataType = 'json'

6
Abhishek

Pour moi, c'est une histoire totalement différente.
Étant donné que cette page présente un bon classement dans les moteurs de recherche, je devrais ajouter mon cas et la solution ici également.

J'ai construit jquery moi-même avec webpack ne sélectionnant que les modules que j'utilise. Le ajax échoue toujours avec le message "Pas de transport" comme seul indice.

Après un long débogage, le problème se révèle être XMLHttpRequest est enfichable dans jquery et il n'est pas inclus par défaut.

Vous devez explicitement inclure le fichier jquery/src/ajax/xhr afin de faire fonctionner l'ajax dans les navigateurs.

0
Curious Sam

J'ai moi aussi eu ce problème et toutes les solutions données ci-dessus ont échoué ou n'étaient pas applicables en raison de restrictions du service Web du client.

Pour cela, j'ai ajouté un iframe dans ma page qui résidait sur le serveur du client. Ainsi, lorsque nous publions nos données sur les iframe et les iframe, nous les publions ensuite sur le service Web. Par conséquent, le référencement interdomaine est éliminé.

Nous avons ajouté une vérification d'origine bidirectionnelle pour confirmer que seule la page autorisée publie des données vers et depuis l'iframe.

J'espère que ça aide

<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);
}
0
Riju Mahna