jQuery Call to WebService mengembalikan kesalahan "No Transport"

163

Saya memiliki layanan web berikut;

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

Stok standar tanpa perubahan pada dekorator kelas.

Saya punya metode jQuery ini;

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);
          }
});

Ini tindakan posting karena nanti saya harus mengirim data ke sana.

Ketika saya menjalankan jQuery saya mendapatkan kesalahan "Tidak ada transportasi" yang dikembalikan.

Satu hal yang juga harus saya sebutkan adalah bahwa jQuery disimpan dalam file HTML sederhana di komputer saya dan WebService juga berjalan di komputer saya.

Tidak ada kode di belakang pada halaman HTML itu hanya halaman web dan bukan ac # project atau apa pun.

Adakah yang bisa mengarahkan saya ke arah yang benar di sini?

grieg
sumber
Bisakah Anda mendapatkan ke layanan web Anda hanya menggunakan browser?
Avitus
Maaf, saya tidak melihat bahwa ini adalah posting yang berbeda (saya mengedit posting ini, berpikir itu milik saya), saya pasti mengklik hyperlink ke yang ini di postingan saya sendiri. Benar-benar minta maaf kepada pemilik pos = \
Erick Garcia
$ .support.cors = true; Jika titik akhir Anda diaktifkan CORS (merespons dengan benar dengan header Access-Control-Allow-Origin, dll), maka baris kode ini akan membujuk jQuery untuk melakukan permintaan lintas asal di IE8. Saya baru saja bertemu ini sebelumnya, berharap itu akan menghemat waktu dan sakit kepala beberapa dari Anda.
Jeremy Hert

Jawaban:

95

Jika halaman jQuery Anda tidak dimuat http://localhost:54473maka masalah ini mungkin karena Anda mencoba membuat permintaan lintas-domain.

Perbarui 1 Lihatlah posting blog ini .

Perbarui 2 Jika ini memang masalahnya (dan saya curiga), Anda mungkin ingin melihat JSONP sebagai solusinya. Berikut adalah beberapa tautan yang mungkin membantu Anda memulai:

no.good.at.coding
sumber
4
Ya, itu mungkin ada hubungannya dengan keamanan.
thenengah
3
Itu tidak harus localhost: 54473, itu hanya harus domain yang sama.
jcolebrand
7
@drachenstern Hm, saya selalu berpikir (dan sepertinya ingat selalu membaca) bahwa skema, host dan port harus sama. Ini dan ini dan ini tampaknya mendukung cara berpikir saya tentang apa yang merupakan domain yang sama.
no.good.at.coding
@drachenstern Senang bisa membantu! Semua hal web ini rumit - sesuatu yang baru untuk dipelajari setiap hari :)
no.good.at.coding
1
@ grieg Bagus untuk didengar tetapi perhatikan bahwa Anda tidak benar-benar menyelesaikan masalah - ini hanya akan berfungsi jika lingkungan memungkinkan permintaan lintas-domain karena Anda hanya menghapus penjaga aman yang ditempatkan jQuery. Jika browser Anda tidak mengizinkannya, pengaturan properti ini tidak akan membantu Anda. Saya akan merekomendasikan sedikit upaya sekarang untuk mendapatkan JSONP di tempat. Paling tidak, Anda mungkin ingin mencoba dan melihat apakah memaksa dukungan lintas domain jQuery berfungsi dengan semua browser yang Anda rencanakan untuk didukung. Saya juga tidak bisa mengomentari apa yang lain masalah yang mungkin mengalami nanti!
no.good.at.coding
253

Tambahkan ini: jQuery.support.cors = true;

Ini memungkinkan skrip lintas situs dalam jQuery (diperkenalkan setelah 1.4x, saya percaya).

Kami menggunakan versi jQuery yang sangat lama (1.3.2) dan menukarnya dengan 1.6.1. Semuanya berfungsi, kecuali panggilan .ajax (). Menambahkan baris di atas memperbaiki masalah.

SrBlanco
sumber
Info lebih lanjut di sini: blueonionsoftware.com/...
Andrew Arnott
14
ini memperbaiki masalah saya, bekerja di chrome dan firefox tetapi tidak pada IE. menambahkan ini ke bagian atas skrip saya dan semuanya baik
Peter
@ SrBlanco Ini memperbaiki masalah saya juga, Terima kasih telah berbagi info ini.
dev
4
Perbaikan yang sangat baik, saya memiliki masalah yang sama pada Internet Explorer 9 ketika saya meminta file kml dari domain yang sama menggunakan jalur relatif ... misteri IE ...
Matteo Conta
Terima kasih. ya panggilan istirahat saya berhenti setelah pembaruan 1,5 jquery. kode ini memperbaikinya.
ashraf
26

Saya memiliki kesalahan yang sama pada halaman, dan saya menambahkan baris ini:

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

dan akhirnya bekerja untuk saya;) tidak ada lagi kesalahan di IE9.

bsuttor
sumber
6
Proyek Github: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest dan XDomainRequest informasi: blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Pada dasarnya, IE8 dan IE9 tidak mendukung CORS pada objek XMLHttpRequest. Anda terpaksa menggunakan objek XDomainRequest sebagai gantinya (yang lebih terbatas. Dapat membaca info di tautan kedua).
richardaday
7

Tak satu pun dari jawaban yang diajukan benar-benar bekerja untuk saya. Kasus penggunaan saya sedikit berbeda (melakukan ajax sampai ke file S3 .json di IE9). Pengaturan jQuery.support.cors = true;menyingkirkan No Transportkesalahan tapi saya masih mendapatkan Permission deniedkesalahan.

Apa yang berhasil bagi saya adalah menggunakan jQuery-ajaxTransport-XDomainRequest untuk memaksa IE9 untuk menggunakan XDomainRequest. Menggunakan ini tidak memerlukan pengaturanjQuery.support.cors = true;

rynop
sumber
6

saya menyelesaikannya dengan menggunakan dataType = 'jsonp' di tempat dataType = 'json'

Abhishek
sumber
2
FYI, itu benar-benar tidak akan berfungsi untuk permintaan poster asli karena jsonp tidak mendukung kata kerja POST, hanya GET.
Daniel Cox
ya ur benar, saya menggunakannya untuk mendapatkan feed dari fbwall, google + dll menggunakan ajax
Abhishek
Saya masih akan memberi +1 karena itu membantu saya gunakan, Terima kasih.
Manatherin
0

Saya juga mendapatkan masalah ini dan semua solusi yang diberikan di atas gagal atau tidak berlaku karena pembatasan layanan web klien.

Untuk ini, saya menambahkan iframe di halaman saya yang berada di server klien; Jadi ketika kita memposting data kita ke iframe dan iframe kemudian mempostingnya ke layanan web. Karenanya referensi silang domain dihilangkan.

Kami menambahkan pemeriksaan asal 2 arah untuk mengonfirmasi hanya data posting halaman yang diotorisasi ke dan dari iframe.

Semoga ini bisa membantu

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

Bagi saya itu adalah cerita yang sama sekali berbeda.
Karena halaman ini memiliki peringkat mesin pencari yang bagus, saya harus menambahkan kasus saya dan solusinya di sini juga.

Saya membangun jquerysendiri dengan webpackmemilih hanya modul yang saya gunakan. Ajax selalu gagal dengan pesan "No Transport" sebagai satu-satunya petunjuk.

Setelah debugging yang lama, masalahnya ternyata bisa XMLHttpRequestdigunakanjquery dan tidak disertakan secara default.

Anda harus secara eksplisit memasukkan jquery/src/ajax/xhrfile untuk membuat ajax berfungsi di browser.

Penasaran Sam
sumber
-1

Saya menyelesaikannya hanya dengan menghapus domain dari url permintaan.

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

After: /_vti_bin/service.svc
Draghon
sumber
1
Ya, permintaan ajax domain-sama jQuery di mana domain tidak ditentukan dalam url. Dalam kasus saya, saya tidak perlu membuat permintaan lintas situs dan tampaknya memiliki domain dalam parameter url dari permintaan ajax membuat permintaan tersebut entah bagaimana berperilaku lintas situs. Lingkungan saya menggunakan Microsoft ForeFront dengan beberapa aturan pengalihan dan ada kemungkinan bahwa hal itu dapat menyebabkan masalah.
Draghon
lalu mengapa Anda menjawab pertanyaan tentang permintaan ajax lintas domain
Naeem Shaikh
1
@ NaeemShaikh27, sifat permintaan (lintas-domain vs domain-sama) tidak jelas dari OP; Saya menjawab pertanyaan yang diberikan parameter "jelas" dalam pertanyaan. Apapun, saya hanya mengatakan "hei, saya mendapat kesalahan yang sama, inilah yang saya lakukan" dan apakah Anda suka atau tidak (atau apakah itu sesuai untuk SO), itu berhasil bagi saya. Sekarang, jika Anda kembali dan membuat pertanyaan lebih spesifik, maka tanggapan saya akan sama sekali tidak relevan.
Draghon