jQuery Call to WebService renvoie l'erreur «No Transport»

163

J'ai le service Web suivant;

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

C'est la norme de stock sans modifications aux 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 de publication car plus tard, je dois y publier des données.

Quand j'exécute le jQuery, j'obtiens une erreur "No transport" renvoyée.

Une chose que je dois également mentionner est que jQuery est stocké dans un simple fichier HTML sur ma machine et que le WebService fonctionne également sur ma machine.

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

Quelqu'un peut-il s'il vous plaît me diriger dans la bonne direction ici?

griegs
la source
Pouvez-vous accéder à votre service Web en utilisant simplement un navigateur?
Avitus
Désolé, je n'ai pas remarqué qu'il s'agit d'un article différent (j'ai édité ce message, pensant que c'était le mien), j'ai dû cliquer sur le lien hypertexte vers celui-ci dans mon propre message. Vraiment désolé pour le propriétaire du message = \
Erick Garcia
$ .support.cors = vrai; Si votre point de terminaison est activé CORS (il répond correctement avec un en-tête Access-Control-Allow-Origin, etc.), cette ligne de code persuadera jQuery de faire une demande d'origine croisée dans IE8. Je viens de rencontrer cela plus tôt, en espérant que cela vous fera gagner du temps et des maux de tête.
Jeremy Hert

Réponses:

95

Si votre page jQuery n'est pas en cours de chargement, http://localhost:54473ce problème est probablement dû au fait que vous essayez de faire une requête entre domaines.

Mise à jour 1 Jetez un œil à ce billet de blog .

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

no.good.at.coding
la source
4
Ouais, cela a probablement quelque chose à voir avec la sécurité.
thenengah
3
Il n'est pas nécessaire que ce soit localhost: 54473, il doit simplement s'agir du même domaine.
jcolebrand
7
@drachenstern Hm, j'ai toujours pensé (et semble me souvenir de toujours lire) que le schéma, l'hôte et le port devaient être les mêmes. Ceci et ceci et cela semblent soutenir ma façon de penser ce qui constitue le même domaine.
no.good.at.coding
@drachenstern Heureux de vous aider! Tout ce truc Web est délicat - quelque chose de nouveau à apprendre tous les jours :)
no.good.at.coding
1
@griegs C'est bien d'entendre, mais notez que vous ne résolvez pas réellement le problème - cela ne fonctionnera que si l'environnement autorise les requêtes inter-domaines puisque vous ne supprimez que les protections que jQuery met en place. Si votre navigateur ne le permet pas, la définition de cette propriété ne fera rien pour vous. Je recommanderais de faire un peu d'efforts maintenant pour mettre JSONP en place. À tout le moins, vous voudrez peut-être essayer de voir si le fait de forcer la prise en charge interdomaine de jQuery fonctionne avec tous les navigateurs que vous prévoyez de prendre en charge. Je ne peux pas non plus commenter les autres problèmes que vous pourriez rencontrer plus tard!
no.good.at.coding
253

Ajoute ça: jQuery.support.cors = true;

Il permet le script intersite dans jQuery (introduit après 1.4x, je crois).

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

SrBlanco
la source
Un peu plus d'infos ici: blueonionsoftware.com
Andrew Arnott
14
cela résout mon problème, a fonctionné dans Chrome et Firefox mais pas IE. a ajouté ceci en haut de mon script et tout allait bien
Peter
@SrBlanco Cela corrige mon problème aussi, merci d'avoir partagé cette information.
dev
4
Très bonne correction, j'ai eu le même problème sur Internet Explorer 9 lorsque je demandais un fichier kml du même domaine en utilisant un chemin relatif ... les mystères d'IE ...
Matteo Conta
Merci. oui mes appels de repos se sont arrêtés après 1.5 mises à jour jquery. ce code l'a corrigé.
ashraf
26

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.

bsuttor
la source
6
Projet Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest et informations XDomainRequest: blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Fondamentalement, IE8 et IE9 ne prennent pas en charge CORS sur l'objet XMLHttpRequest. Vous êtes obligé d'utiliser à la place l'objet XDomainRequest (qui est plus limité. Peut lire les informations sur le deuxième lien).
richardaday
7

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 pour accéder à un fichier S3 .json dans IE9). Le réglage jQuery.support.cors = true;a éliminé l' No Transporterreur mais j'obtenais toujours des Permission deniederreurs.

Ce qui a fonctionné pour moi, c'est d'utiliser le jQuery-ajaxTransport-XDomainRequest pour forcer IE9 à utiliser XDomainRequest. Son utilisation ne nécessitait pas de réglagejQuery.support.cors = true;

rynop
la source
6

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

Abhishek
la source
2
FYI, cela ne fonctionnerait vraiment pas pour la demande de l'affiche originale puisque jsonp ne prend pas en charge le verbe POST, seulement GET.
Daniel Cox
tu as raison, je l'ai utilisé pour obtenir des flux de fbwall, google +, etc. en utilisant ajax
Abhishek
Je vais toujours donner un +1 car cela m'a aidé pour mon utilisation, merci.
Manatherin
0

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 des 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 dans l'iframe et l'iframe, nous les publions sur le service Web. Par conséquent, le référencement inter-domaines est éliminé.

Nous avons ajouté une vérification d'origine bidirectionnelle pour confirmer que seules les pages autorisées publient 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);
}
Riju Mahna
la source
0

Pour moi, c'est une histoire complètement différente.
Puisque cette page a un bon classement dans les moteurs de recherche, je devrais ajouter mon cas et la solution ici aussi.

Je jqueryme suis construit webpacken ne sélectionnant que les modules que j'utilise. L'ajax échoue toujours avec le message "No Transport" comme seul indice.

Après un long débogage, le problème s'avère être XMLHttpRequestenfichable jqueryet non inclus par défaut.

Vous devez inclure explicitement le jquery/src/ajax/xhrfichier pour que l'ajax fonctionne dans les navigateurs.

Curieux Sam
la source
-1

Je l'ai résolu simplement en supprimant le domaine de l'url de la requête.

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

After: /_vti_bin/service.svc
Draghon
la source
1
Oui, jQuery demande ajax du même domaine où le domaine n'est pas spécifié dans l'url. Dans mon cas, je n'avais pas besoin de faire une demande intersite et il semble que le fait d'avoir le domaine dans le paramètre url de la demande ajax a fait que la demande se comporte d'une manière ou d'une autre entre les sites. Mon environnement utilise Microsoft ForeFront avec certaines règles de redirection et il est possible que cela soit à l'origine des problèmes.
Draghon
alors pourquoi répondez-vous à la question concernant la demande ajax
interdomaine
1
@ NaeemShaikh27, la nature de la demande (interdomaine vs même domaine) n'était pas claire à partir de l'OP; J'abordais la question étant donné les paramètres «évidents» de la question. Quoi qu'il en soit, je dis simplement "hé, j'ai eu la même erreur, voici ce que j'ai fait" et que cela vous plaise ou non (ou si c'est approprié pour SO), cela a fonctionné pour moi. Maintenant, si vous revenez en arrière et spécifiez la question, ma réponse sera-t-elle complètement hors de propos.
Draghon