jQuery Call to WebService restituisce l'errore "Nessun trasporto"


163

Ho il seguente servizio web;

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

È standard di serie senza modifiche ai decoratori di classe.

Ho questo metodo 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);
          }
});

È un'azione post perché in seguito ho bisogno di pubblicare dati su di essa.

Quando eseguo jQuery, viene restituito un errore "Nessun trasporto".

Una cosa che dovrei anche menzionare è che jQuery è memorizzato in un semplice file HTML sulla mia macchina e anche il WebService è in esecuzione sulla mia macchina.

Non c'è codice dietro nella pagina HTML, è semplicemente una pagina web e non un progetto ac # o altro.

Qualcuno può indicarmi la giusta direzione qui?


Riesci ad accedere al tuo servizio web semplicemente usando un browser?
Avitus,

Spiacente, non ho notato che questo è un post diverso (ho modificato questo post, pensando che fosse il mio), devo aver fatto clic sul collegamento ipertestuale a questo nel mio post. Mi dispiace davvero per il proprietario della posta = \
Erick Garcia, il

$ .support.cors = true; Se l'endpoint è abilitato CORS (risponde correttamente con un'intestazione Access-Control-Allow-Origin, ecc.), Questa riga di codice convincerà jQuery a eseguire una richiesta di origine incrociata in IE8. Mi sono appena imbattuto in questo prima, sperando che possa far risparmiare tempo e mal di testa ad alcuni di voi.
Jeremy Hert,

Risposte:


95

Se la tua pagina jQuery non viene caricata da http://localhost:54473allora, probabilmente questo problema è dovuto al fatto che stai provando a fare una richiesta tra domini.

Aggiornamento 1 Dai un'occhiata a questo post sul blog .

Aggiornamento 2 Se questo è davvero il problema (e sospetto che lo sia), potresti voler controllare JSONP come soluzione. Ecco alcuni link che potrebbero aiutarti a iniziare:


4
Sì, probabilmente ha qualcosa a che fare con la sicurezza.
thenengah

3
Non deve essere localhost: 54473, deve solo essere lo stesso dominio.
jcolebrand,

7
@drachenstern Hm, ho sempre pensato (e mi sembra di ricordare sempre di aver letto) che lo schema, l'host e la porta dovevano essere uguali. Questo e questo e questo sembrano supportare il mio modo di pensare a ciò che costituisce lo stesso dominio.
no.good.at.coding

@drachenstern Sono contento di essere d'aiuto! Tutta questa roba sul web è complicata - qualcosa di nuovo da imparare ogni giorno :)
no.good.at.coding

1
@griegs Buono a sapersi, ma nota che in realtà non stai risolvendo il problema, questo funzionerà solo se l'ambiente consente richieste tra domini poiché stai rimuovendo solo le protezioni sicure che jQuery mette in atto. Se il tuo browser non lo consente, l'impostazione di questa proprietà non farà nulla per te. Vorrei raccomandare un po 'di sforzo ora per mettere in atto JSONP. Per lo meno, potresti voler provare a vedere se forzare il supporto interdominio jQuery funziona con tutti i browser che prevedi di supportare. Inoltre, non posso commentare quali altri problemi potresti incontrare in seguito!
no.good.at.coding

253

Aggiungi questo: jQuery.support.cors = true;

Abilita lo scripting cross-site in jQuery (introdotto dopo 1.4x, credo).

Stavamo usando una versione davvero vecchia di jQuery (1.3.2) e l'abbiamo sostituita con 1.6.1. Tutto funzionava, tranne le chiamate .ajax (). L'aggiunta della riga precedente ha risolto il problema.


Altre informazioni qui: blueonionsoftware.com/…
Andrew Arnott,

14
questa soluzione risolveva il mio problema, funzionava con Chrome e Firefox ma non con IE. aggiunto questo all'inizio della mia sceneggiatura e tutto andava bene
Peter

@SrBlanco Questa soluzione risolve anche il mio problema, grazie per aver condiviso queste informazioni.
dev

4
Ottima soluzione, ho avuto lo stesso problema su Internet Explorer 9 quando chiedevo un file kml dallo stesso dominio usando un percorso relativo ... misteri di IE ...
Matteo Conta,

Grazie. sì, le mie chiamate di riposo si sono interrotte dopo 1.5 aggiornamenti di jquery. questo codice lo ha riparato.
Ashraf,

26

Ho avuto lo stesso errore su una pagina e ho aggiunto queste righe:

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

e finalmente funziona per me;) niente più errore in IE9.


6
Progetto Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest e XDomainRichiedi informazioni: blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Fondamentalmente, IE8 e IE9 non supportano CORS sull'oggetto XMLHttpRequest. Sei invece costretto a usare l'oggetto XDomainRequest (che è più limitato. Puoi leggere le informazioni sul secondo link).
richardaday,

7

Nessuna delle risposte proposte ha funzionato completamente per me. Il mio caso d'uso è leggermente diverso (facendo un Ajax arriva ad un file S3 .json in IE9). L'impostazione jQuery.support.cors = true;ha eliminato l' No Transporterrore ma continuavo a ricevere Permission deniederrori.

Quello che ha funzionato per me è stato usare jQuery-ajaxTransport-XDomainRequest per forzare IE9 a usare XDomainRequest. L'uso di questo non ha richiesto l'impostazionejQuery.support.cors = true;


6

lo risolvo usando dataType = 'jsonp' al posto di dataType = 'json'


2
Cordiali saluti, che in realtà non avrebbe funzionato per la richiesta del poster originale poiché jsonp non supporta il verbo POST, solo GET.
Daniel Cox,

hai ragione, l'ho usato per ottenere feed di fbwall, google + etc usando ajax
Abhishek,

Ho ancora intenzione di dare un +1 perché mi ha aiutato, grazie.
Manatherin,

0

Anch'io ho riscontrato questo problema e tutte le soluzioni sopra indicate sono fallite o non erano applicabili a causa delle restrizioni del servizio web del cliente.

Per questo, ho aggiunto un iframe nella mia pagina che risiedeva nel server del client. Pertanto, quando pubblichiamo i nostri dati su iframe e iframe, li pubblichiamo sul servizio web. Quindi il riferimento tra domini viene eliminato.

Abbiamo aggiunto un controllo dell'origine a 2 vie per confermare solo i dati dei post delle pagine autorizzati da e verso l'iframe.

Spero che sia d'aiuto

<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

Per me è una storia completamente diversa.
Poiché questa pagina ha un buon posizionamento nei motori di ricerca, dovrei aggiungere il mio caso e la soluzione anche qui.

Ho costruito jqueryio stesso con webpackla raccolta solo i moduli che uso. L'ajax è sempre fallito con il messaggio "Nessun trasporto" come unico indizio.

Dopo un lungo debug, il problema risulta essere XMLHttpRequestcollegabile jquerye non incluso per impostazione predefinita.

Devi includere esplicitamente il jquery/src/ajax/xhrfile per far funzionare ajax nei browser.


-1

L'ho risolto semplicemente rimuovendo il dominio dall'URL della richiesta.

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

After: /_vti_bin/service.svc

1
Sì, richiesta ajax dello stesso dominio jQuery in cui il dominio non è specificato nell'URL. Nel mio caso, non avevo bisogno di fare una richiesta tra siti e sembra che avere il dominio nel parametro url della richiesta ajax abbia fatto in qualche modo che la richiesta si comportasse in un sito. Il mio ambiente utilizza Microsoft ForeFront con alcune regole di reindirizzamento ed è possibile che ciò possa causare i problemi.
Draghon,

allora perché stai rispondendo alla domanda relativa alla richiesta
Ajax

1
@ NaeemShaikh27, la natura della richiesta (interdominio vs stesso dominio) non era chiara dall'OP; Stavo affrontando la domanda dati i parametri "ovvi" nella domanda. Indipendentemente da ciò, sto solo dicendo "ehi, ho avuto lo stesso errore, ecco cosa ho fatto" e se ti piace o no (o se è appropriato per SO), ha funzionato per me. Ora, se torni indietro e rendi la domanda più specifica, allora la mia risposta sarà completamente irrilevante.
Draghon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.