Der jQuery-Aufruf von WebService gibt den Fehler "Kein Transport" zurück

163

Ich habe den folgenden Webdienst;

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

Es ist Standard, ohne Änderungen an den Klassendekorateuren.

Ich habe diese jQuery-Methode;

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 ist eine Post-Aktion, weil ich später Daten darauf posten muss.

Wenn ich jQuery ausführe, wird der Fehler "Kein Transport" zurückgegeben.

Eine Sache, die ich auch erwähnen sollte, ist, dass die jQuery in einer einfachen HTML-Datei auf meinem Computer gespeichert ist und der WebService auch auf meinem Computer ausgeführt wird.

Es gibt keinen Code auf der HTML-Seite, es ist einfach eine Webseite und kein AC # -Projekt oder so.

Kann mir bitte jemand hier die richtige Richtung weisen?

Griegs
quelle
Können Sie Ihren Webdienst nur mit einem Browser aufrufen?
Avitus
Entschuldigung, ich habe nicht bemerkt, dass dies ein anderer Beitrag ist (ich habe diesen Beitrag bearbeitet und dachte, er sei mein eigener). Ich muss auf den Hyperlink zu diesem Beitrag in meinem eigenen Beitrag geklickt haben. Wirklich leid an den Postbesitzer = \
Erick Garcia
$ .support.cors = true; Wenn Ihr Endpunkt CORS-fähig ist (er antwortet korrekt mit einem Access-Control-Allow-Origin-Header usw.), wird diese Codezeile jQuery dazu verleiten, eine Cross-Origin-Anforderung in IE8 auszuführen. Ich bin gerade früher darauf gestoßen, in der Hoffnung, dass es einigen von Ihnen Zeit und Kopfschmerzen erspart.
Jeremy Hert

Antworten:

95

Wenn Ihre jQuery-Seite nicht geladen http://localhost:54473wird, liegt dieses Problem wahrscheinlich daran, dass Sie versuchen, eine domänenübergreifende Anfrage zu stellen.

Update 1 Schauen Sie sich diesen Blog-Beitrag an .

Update 2 Wenn dies tatsächlich das Problem ist (und ich vermute, dass dies der Fall ist), sollten Sie JSONP als Lösung ausprobieren. Hier sind einige Links, die Ihnen den Einstieg erleichtern könnten:

no.good.at.coding
quelle
4
Ja, es hat wahrscheinlich etwas mit Sicherheit zu tun.
Thenengah
3
Es muss nicht localhost sein: 54473, es muss nur dieselbe Domain sein.
jcolebrand
7
@drachenstern Hm, ich habe immer gedacht (und erinnere mich anscheinend immer daran gelesen zu haben), dass das Schema, der Host und der Port gleich sein müssen. Dies und das und das scheinen meine Denkweise darüber zu unterstützen, was dieselbe Domäne ausmacht.
no.good.at.coding
@drachenstern Freut mich zu helfen! All dieses Web-Zeug ist knifflig - etwas Neues, das man jeden
Tag
1
@griegs Gut zu hören, aber beachten Sie, dass Sie das Problem nicht tatsächlich lösen. Dies funktioniert nur, wenn die Umgebung domänenübergreifende Anforderungen zulässt, da Sie nur die von jQuery eingerichteten Schutzmaßnahmen entfernen. Wenn Ihr Browser dies nicht zulässt, führt das Festlegen dieser Eigenschaft nichts für Sie aus. Ich würde empfehlen, sich jetzt ein wenig anzustrengen, um JSONP zu installieren. Zumindest möchten Sie vielleicht herausfinden, ob das Erzwingen der domänenübergreifenden Unterstützung von jQuery mit allen Browsern funktioniert, die Sie unterstützen möchten. Ich kann auch nicht kommentieren, auf welche anderen Probleme Sie später stoßen könnten!
no.good.at.coding
252

Füge das hinzu: jQuery.support.cors = true;

Es ermöglicht Cross-Site-Scripting in jQuery (glaube ich, eingeführt nach 1.4x).

Wir haben eine wirklich alte Version von jQuery (1.3.2) verwendet und gegen 1.6.1 ausgetauscht. Alles funktionierte, außer .ajax () -Aufrufen. Das Hinzufügen der obigen Zeile hat das Problem behoben.

SrBlanco
quelle
Ein bisschen mehr Infos hier: blueonionsoftware.com/…
Andrew Arnott
14
Dies behebt mein Problem, funktionierte in Chrome und Firefox, aber nicht in IE. fügte dies oben in meinem Skript hinzu und alles war gut
Peter
@SrBlanco Dies behebt auch mein Problem. Danke, dass du diese Informationen geteilt hast.
Dev
4
Sehr gute Lösung, ich hatte das gleiche Problem in Internet Explorer 9, als ich eine kml-Datei von derselben Domain über einen relativen Pfad anforderte ... Geheimnisse des IE ...
Matteo Conta
Vielen Dank. Ja, meine Restanrufe wurden nach 1,5 JQuery-Updates gestoppt. Dieser Code hat es behoben.
Ashraf
26

Ich hatte den gleichen Fehler auf einer Seite und fügte die folgenden Zeilen hinzu:

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

und es funktioniert endlich bei mir;) kein fehler mehr im IE9.

bsuttor
quelle
6
Github-Projekt: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest und XDomainRequest-Informationen: blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Grundsätzlich unterstützen IE8 und IE9 CORS für XMLHttpRequest-Objekte nicht. Sie müssen stattdessen das XDomainRequest-Objekt verwenden (was eingeschränkter ist. Sie können die Informationen auf dem zweiten Link lesen).
Richardaday
7

Keine der vorgeschlagenen Antworten hat für mich vollständig funktioniert. Mein Anwendungsfall ist etwas anders (ein Ajax-Zugriff auf eine S3 .json-Datei in IE9). Durch das Einstellen wurde jQuery.support.cors = true;der No TransportFehler behoben, aber ich bekam ihn immer nochPermission denied Fehler.

Was für mich funktioniert hat, war die Verwendung von jQuery-ajaxTransport-XDomainRequest , um IE9 zur Verwendung von XDomainRequest zu zwingen. Für die Verwendung war keine Einstellung erforderlichjQuery.support.cors = true;

rynop
quelle
6

Ich löse es mit dataType = 'jsonp' an der Stelle von dataType = 'json'.

Abhishek
quelle
2
Zu Ihrer Information, das würde für die Anfrage des Originalplakats wirklich nicht funktionieren, da jsonp das POST-Verb nicht unterstützt, sondern nur GET.
Daniel Cox
ya ur richtig, ich habe es verwendet, um Feeds von fbwall, google + etc mit Ajax zu bekommen
Abhishek
Ich werde immer noch +1 geben, weil es mir geholfen hat, danke.
Manatherin
0

Auch ich habe dieses Problem und alle oben genannten Lösungen sind entweder fehlgeschlagen oder aufgrund von Einschränkungen des Client-Webservices nicht anwendbar.

Zu diesem Zweck habe ich meiner Seite einen Iframe hinzugefügt, der sich auf dem Server des Clients befindet. Wenn wir also unsere Daten im Iframe und im Iframe veröffentlichen, werden sie im Webservice veröffentlicht. Daher entfällt die domänenübergreifende Referenzierung.

Wir haben eine 2-Wege-Ursprungsprüfung hinzugefügt, um zu bestätigen, dass nur autorisierte Seiten Daten zum und vom Iframe veröffentlichen.

Ich hoffe es hilft

<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
quelle
0

Für mich ist das eine ganz andere Geschichte.
Da diese Seite ein gutes Suchmaschinenranking hat, sollte ich auch hier meinen Fall und die Lösung hinzufügen.

Ich habe jquerymich damit gebaut webpack, nur die Module auszuwählen, die ich benutze. Der Ajax schlägt immer mit der Meldung "Kein Transport" als einzigem Hinweis fehl.

Nach einem langen Debugging stellt sich heraus, dass das Problem XMLHttpRequeststeckbar istjquery und standardmäßig nicht enthalten ist.

Sie müssen die jquery/src/ajax/xhrDatei explizit einschließen , damit der Ajax in Browsern funktioniert.

Neugieriger Sam
quelle
-1

Ich habe es einfach gelöst, indem ich die Domain aus der Anforderungs-URL entfernt habe.

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

After: /_vti_bin/service.svc
Draghon
quelle
1
Ja, jQuery-Ajax-Anforderung für dieselbe Domäne, bei der die Domäne nicht in der URL angegeben ist. In meinem Fall musste ich keine standortübergreifende Anfrage stellen, und es scheint, dass die Domain im URL-Parameter der Ajax-Anfrage dazu geführt hat, dass sich die Anfrage irgendwie standortübergreifend verhält. Meine Umgebung verwendet Microsoft ForeFront mit einigen Umleitungsregeln, und es ist möglich, dass dies die Probleme verursacht.
Draghon
Warum beantworten Sie dann die Frage bezüglich einer domänenübergreifenden Ajax-Anfrage
?
1
@ NaeemShaikh27, die Art der Anfrage (domänenübergreifend vs. domänenübergreifend) war aus dem OP nicht ersichtlich; Ich habe die Frage angesichts der "offensichtlichen" Parameter in der Frage angesprochen. Unabhängig davon sage ich nur "Hey, ich habe den gleichen Fehler, hier ist was ich getan habe" und ob es dir gefällt oder nicht (oder ob es für SO angemessen ist), es hat bei mir funktioniert. Wenn Sie jetzt zurückgehen und die Frage genauer formulieren, ist meine Antwort völlig irrelevant.
Draghon