Wywołanie jQuery do usługi WebService zwraca błąd „Brak transportu”

163

Mam następującą usługę internetową;

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

Jest to standard magazynowy bez zmian w klasach dekoratorów.

Mam tę metodę 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);
          }
});

Jest to akcja wysyłania, ponieważ później muszę przesłać do niej dane.

Kiedy wykonuję jQuery, zwracany jest błąd „Brak transportu”.

Powinienem również wspomnieć, że jQuery jest przechowywany w prostym pliku HTML na moim komputerze, a usługa WebService również działa na moim komputerze.

Na stronie HTML nie ma kodu, to po prostu strona internetowa, a nie projekt ac # ani cokolwiek.

Czy ktoś może mi tutaj wskazać właściwy kierunek?

griegs
źródło
Czy możesz uzyskać dostęp do swojej usługi internetowej za pomocą przeglądarki?
Avitus
Przepraszam, nie zauważyłem, że to inny post (edytowałem ten post, myśląc, że to mój własny), musiałem kliknąć hiperłącze do tego w moim własnym poście. Naprawdę przepraszam właściciela posta = \
Erick Garcia
$ .support.cors = true; Jeśli twój punkt końcowy ma włączoną obsługę CORS (odpowiada poprawnie z nagłówkiem Access-Control-Allow-Origin itp.), To ten wiersz kodu przekona jQuery do wykonania żądania krzyżowego w IE8. Po prostu wpadłem na to wcześniej, mając nadzieję, że zaoszczędzi to niektórym z was czasu i bólu głowy.
Jeremy Hert

Odpowiedzi:

95

Jeśli Twoja strona jQuery nie jest ładowana od http://localhost:54473tego czasu, problem prawdopodobnie wynika z tego, że próbujesz wykonać żądanie międzydomenowe.

Aktualizacja 1 Spójrz na ten wpis na blogu .

Aktualizacja 2 Jeśli rzeczywiście jest to problem (i podejrzewam, że tak), możesz chcieć sprawdzić JSONP jako rozwiązanie. Oto kilka linków, które mogą pomóc w rozpoczęciu:

no.good.at.coding
źródło
4
Tak, prawdopodobnie ma to coś wspólnego z bezpieczeństwem.
thenengah
3
Nie musi to być localhost: 54473, po prostu musi to być ta sama domena.
jcolebrand
7
@drachenstern Hm, zawsze myślałem (i zdaje się, że zawsze czytałem), że schemat, host i port muszą być takie same. To i to i to wydają się wspierać mój sposób myślenia o tym, co stanowi tę samą dziedzinę.
no.good.at.coding
@drachenstern Cieszę się, że mogłem pomóc! Wszystkie te internetowe rzeczy są trudne - coś nowego do nauczenia się
każdego dnia
1
@griegs Dobrze to słyszeć, ale pamiętaj, że tak naprawdę nie rozwiązujesz problemu - zadziała to tylko wtedy, gdy środowisko zezwala na żądania międzydomenowe, ponieważ usuwasz tylko zabezpieczenia, które wprowadza jQuery. Jeśli Twoja przeglądarka na to nie zezwala, ustawienie tej właściwości nic nie da. Poleciłbym włożyć teraz trochę wysiłku w zainstalowanie JSONP. Przynajmniej możesz spróbować sprawdzić, czy wymuszenie obsługi wielu domen przez jQuery działa ze wszystkimi przeglądarkami, które planujesz obsługiwać. Nie mogę też komentować innych problemów, na które możesz napotkać później!
no.good.at.coding
253

Dodaj: jQuery.support.cors = true;

Umożliwia cross-site scripting w jQuery (chyba po 1.4x).

Używaliśmy naprawdę starej wersji jQuery (1.3.2) i zamieniliśmy ją na 1.6.1. Wszystko działało, z wyjątkiem wywołań .ajax (). Dodanie powyższej linii rozwiązało problem.

SrBlanco
źródło
Trochę więcej informacji tutaj: blueonionsoftware.com/…
Andrew Arnott
14
to naprawiło mój problem, działało w Chrome i Firefox, ale nie w IE. dodał to na początek mojego scenariusza i wszystko było dobrze
Peter
@SrBlanco To też rozwiązuje mój problem. Dzięki za udostępnienie tych informacji.
dev,
4
Bardzo dobra poprawka, miałem ten sam problem w przeglądarce Internet Explorer 9, gdy żądałem pliku kml z tej samej domeny, używając ścieżki względnej ... tajemnice IE ...
Matteo Conta
dzięki. tak, moje wywołania reszty zatrzymały się po aktualizacji 1.5 jQuery. ten kod naprawił to.
ashraf
26

Na stronie wystąpił ten sam błąd i dodałem te wiersze:

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

i wreszcie u mnie działa;) koniec z błędami w IE9.

bsuttor
źródło
6
Projekt Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest i informacje o XDomainRequest : blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Zasadniczo IE8 i IE9 nie obsługują CORS w obiekcie XMLHttpRequest. Jesteś zmuszony zamiast tego użyć obiektu XDomainRequest (który jest bardziej ograniczony. Możesz przeczytać informacje na drugim linku).
richardaday,
7

Żadna z proponowanych odpowiedzi nie pomogła mi całkowicie. Mój przypadek użycia jest nieco inny (wykonanie AJAXa w celu uzyskania dostępu do pliku S3 .json w IE9). OprawajQuery.support.cors = true; pozbyło się No Transportbłędu, ale nadal otrzymywałem Permission deniedbłędy.

U mnie zadziałało użycie jQuery-ajaxTransport-XDomainRequest, aby zmusić IE9 do korzystania z XDomainRequest. Korzystanie z tego nie wymagało ustawieniajQuery.support.cors = true;

rynop
źródło
6

rozwiązuję to, używając dataType = 'jsonp' w miejscu dataType = 'json'

Abhishek
źródło
2
FYI, to naprawdę nie zadziała w przypadku żądania oryginalnego autora, ponieważ jsonp nie obsługuje czasownika POST, tylko GET.
Daniel Cox
masz rację, użyłem go do pobierania kanałów fbwall, google + itp. przy użyciu Ajax
Abhishek
Nadal mam zamiar dać +1, ponieważ pomogło mi to. Dzięki.
Manatherin
0

Ja również napotkałem ten problem i wszystkie powyższe rozwiązania zawiodły lub nie miały zastosowania z powodu ograniczeń usług sieciowych klienta.

W tym celu dodałem element iframe na mojej stronie, który znajdował się na serwerze klienta. Kiedy więc publikujemy nasze dane w elementach iframe i iframe, umieszczamy je w usłudze sieciowej. W związku z tym odsyłacze międzydomenowe są wyeliminowane.

Dodaliśmy dwukierunkową kontrolę pochodzenia, aby potwierdzić, że tylko autoryzowane strony publikują dane do iz elementu iframe.

Mam nadzieję, że to pomoże

<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
źródło
0

Dla mnie to zupełnie inna historia.
Ponieważ ta strona ma dobry ranking w wyszukiwarkach, powinienem dodać tutaj moją sprawę i rozwiązanie.

Zbudowałem jquerysię, webpackwybierając tylko moduły, których używam. Ajax zawsze kończy się niepowodzeniem, a jedyną wskazówką jest komunikat „No Transport”.

Po długim debugowaniu okazuje się, że problem XMLHttpRequestjest możliwy do podłączenia jqueryi domyślnie nie obejmuje.

Musisz jawnie dołączyć jquery/src/ajax/xhrplik, aby Ajax działał w przeglądarkach.

Ciekawy Sam
źródło
-1

Rozwiązałem to po prostu usuwając domenę z adresu URL żądania.

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

After: /_vti_bin/service.svc
Draghon
źródło
1
Tak, żądanie jQuery w tej samej domenie ajax, w którym domena nie jest określona w adresie URL. W moim przypadku nie musiałem wysyłać żądania między witrynami i wydaje się, że posiadanie domeny w parametrze url żądania ajax sprawiło, że żądanie zachowywało się w jakiś sposób w różnych witrynach. Moje środowisko korzysta z Microsoft ForeFront z pewnymi regułami przekierowania i możliwe, że to może powodować problemy.
Draghon,
to dlaczego odpowiadasz na pytanie dotyczące żądania
AJAX
1
@ NaeemShaikh27, charakter wniosku (międzydomenowy vs z tą samą domeną) nie był jasny z PO; Odpowiadałem na pytanie, biorąc pod uwagę „oczywiste” parametry pytania. Niezależnie od tego, mówię tylko "hej, mam ten sam błąd, oto co zrobiłem" i czy ci się to podoba, czy nie (lub czy jest to odpowiednie dla SO), zadziałało dla mnie. Teraz, jeśli wrócisz i sprecyzujesz pytanie, moja odpowiedź będzie zupełnie nieistotna.
Draghon