jQuery WebService Çağrısı “Aktarım Yok” hatası döndürüyor


163

Aşağıdaki web hizmetine sahibim;

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

Sınıf dekoratörlerinde hiçbir değişiklik yapılmadan stok standardıdır.

Bu jQuery yöntemi var;

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

Bu bir gönderi eylemidir, çünkü daha sonra ona veri göndermem gerekiyor.

JQuery yürüttüğümde "Aktarım yok" hatası döndürdüm.

Ayrıca bahsetmem gereken bir şey, jQuery benim makinede basit bir HTML dosyasında saklanır ve WebService de benim makinede çalışıyor olmasıdır.

HTML sayfasında kod yok sadece bir web sayfası ve ac # proje ya da başka bir şey değil.

Birisi beni burada doğru yöne yönlendirebilir mi?


Web hizmetinize yalnızca bir tarayıcı kullanarak ulaşabiliyor musunuz?
Avitus'un

Üzgünüm, bunun farklı bir gönderi olduğunu fark etmedim (bu gönderiyi kendim olduğunu düşündüm), kendi gönderimde bu köprüye tıklamam gerekiyordu. Yazı sahibine gerçekten üzgünüm = \
Erick Garcia

$ .support.cors = true; Bitiş noktanız CORS etkinse (Access-Control-Allow-Origin üstbilgisi vb. İle doğru yanıt verirse), bu kod satırı jQuery'yi IE8'de çapraz kökenli bir istek yapmaya ikna edecektir. Daha önce karşılaştım, bazılarınızın zaman ve baş ağrısını kurtaracağını umuyorum.
Jeremy Hert

Yanıtlar:


95

JQuery sayfanız yüklenmiyorsa, http://localhost:54473bu sorun muhtemelen etki alanları arası istekte bulunmaya çalıştığınızdan kaynaklanmaktadır.

Güncelleme 1 Bu blog yazısına bir göz atın .

Güncelleme 2 Bu gerçekten bir sorunsa (ve şüpheliyim), bir çözüm olarak JSONP'yi kontrol etmek isteyebilirsiniz. İşte başlamanıza yardımcı olabilecek birkaç bağlantı:


4
Evet, muhtemelen güvenlikle ilgisi var.
thenengah

3
Localhost olmak zorunda değil: 54473, sadece aynı etki alanı olmalı.
jcolebrand

7
@drachenstern Hm, her zaman planın, sunucunun ve limanın aynı olması gerektiğini düşündüm (ve her zaman okuduğumu hatırlıyorum) . Bu ve bu ve bu , aynı alanı neyin oluşturduğuna dair düşünme biçimimi destekliyor gibi görünüyor.
no.good.at.coding

@drachenstern Yardım etmekten mutluluk duyuyoruz! Tüm bu web şeyler zor - her gün öğrenmek için yeni bir şey :)
no.good.at.coding

1
@griegs Duymak güzel ama sorunu gerçekten çözmediğinizi unutmayın - bu yalnızca ortamın etki alanları arası isteklere izin vermesi durumunda çalışır, çünkü yalnızca jQuery'nin koyduğu güvenlik korumalarını kaldırırsınız. Tarayıcınız buna izin vermiyorsa, bu özelliği ayarlamak sizin için hiçbir şey yapmaz. Şimdi JSONP yerine almak için biraz çaba koyarak öneriyoruz. En azından, jQuery etki alanları arası desteğe zorlamanın, desteklemeyi planladığınız tüm tarayıcılarla çalışıp çalışmadığını görmek isteyebilirsiniz. Daha sonra karşılaşabileceğiniz başka sorunlar hakkında da yorum yapamam !
no.good.at.coding

253

Bunu ekle: jQuery.support.cors = true;

JQuery'de siteler arası komut dosyası oluşturmayı sağlar (1.4x'ten sonra tanıtıldığına inanıyorum).

JQuery'nin (1.3.2) gerçekten eski bir sürümünü kullanıyorduk ve 1.6.1 için değiştirdik. .Ajax () çağrıları dışında her şey çalışıyordu. Yukarıdaki satırı eklemek sorunu çözdü.


Biraz daha fazla bilgi burada: blueonionsoftware.com/…
Andrew Arnott

14
Bu sorunumu gidermek, krom ve firefox çalıştı ama IE değil. bunu senaryomun başına ekledi ve her şey iyiydi
Peter

@SrBlanco Bu sorunumu da düzeltti, Bu bilgiyi paylaştığın için teşekkürler.
dev

4
Çok iyi bir düzeltme, göreceli bir yol kullanarak aynı etki alanından bir kml dosyası isterken Internet Explorer 9'da aynı sorunu yaşadım ... IE gizemleri ...
Matteo Conta

Teşekkürler. evet 1.5 jquery güncellemelerinden sonra geri kalan çağrılarım durdu. bu kod düzeltildi.
ashraf

26

Bir sayfada aynı hatayla karşılaştım ve şu satırları ekledim:

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

ve nihayet benim için çalışıyor; IE9 artık hata.


6
Github projesi: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest ve XDomainRequest bilgileri: blogs.msdn.com/b/ieinternals/archive/2010/05/13/… . Temel olarak IE8 ve IE9, XMLHttpRequest nesnesinde CORS'yi desteklemez. Bunun yerine XDomainRequest nesnesini kullanmak zorundasınız (bu daha sınırlıdır. İkinci bağlantıdaki bilgileri okuyabilir).
richardaday

7

Önerilen cevapların hiçbiri benim için tamamen işe yaramadı. Kullanım durumum biraz farklı (IE9 S3 .json dosyasına ajax olsun). Ayar hatadan jQuery.support.cors = true;kurtuldu No Transportama hala hata alıyordum Permission denied.

Benim için işe yarayan , IE9'u XDomainRequest kullanmaya zorlamak için jQuery-ajaxTransport-XDomainRequest kullanmaktı. Bunu kullanmak ayar gerektirmiyordujQuery.support.cors = true;


6

i DataType = 'json' yerinde dataType = 'jsonp' kullanarak çözmek


2
FYI, jsonp POST fiilini desteklemediğinden, orijinal posterin isteği için gerçekten işe yaramaz, sadece GET.
Daniel Cox

doğru mu, ben ajax kullanarak fbwall, google + vb beslemeleri almak için kullanılır
Abhishek

Hala +1 vereceğim çünkü bu benim kullanımım için yardımcı oldu, teşekkürler.
Manatherin

0

Ben de bu sorunu var ve yukarıda verilen tüm çözümler ya başarısız ya da istemci web hizmeti kısıtlamaları nedeniyle uygulanabilir değildi.

Bunun için sayfamda istemcinin sunucusunda bulunan bir iframe ekledim. Bu nedenle, verilerimizi iframe'e ve iframe'e gönderdiğimizde, verileri web hizmetine göndeririz. Böylece, alanlar arası referanslama ortadan kaldırılmıştır.

İframe'e ve iframe'den yalnızca yetkili sayfa yayın verilerini onaylamak için 2 yönlü bir kaynak kontrolü ekledik.

Umarım yardımcı olur

<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

Benim için bu tamamen farklı bir hikaye.
Bu sayfa iyi bir arama motoru sıralamasına sahip olduğundan, burada da davamı ve çözümü eklemeliyim.

jqueryKendimi webpacksadece kullandığım modülleri seçerek inşa ettim. Ajax her zaman tek ipucu olarak "Aktarım Yok" mesajı ile başarısız olur.

Uzun bir hata ayıklamadan sonra, sorun XMLHttpRequesttakılabilir jqueryve varsayılan olarak dahil değildir.

jquery/src/ajax/xhrAjax'ın tarayıcılarda çalışmasını sağlamak için dosyayı açıkça eklemeniz gerekir .


-1

Ben sadece istek url alanından kaldırarak çözdü.

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

After: /_vti_bin/service.svc

1
Evet, alan adının url'de belirtilmediği jQuery aynı alan adı ajax isteği. Benim durumumda, siteler arası bir istekte bulunmam gerekmiyordu ve ajax isteğinin url parametresinde etki alanı olması, isteğin bir şekilde siteler arası davranmasını sağladı gibi görünüyor. Ortamım bazı yönlendirme kurallarıyla Microsoft ForeFront kullanıyor ve sorunlara neden olabilir.
Draghon

o zaman neden
alanlar

1
@ NaeemShaikh27, isteğin doğası (alanlar arası vs aynı alan adı) OP'den net değildi; Soruda "açık" parametreler verildiğinde soruyu ele alıyordum. Ne olursa olsun, sadece "hey, aynı hatayı aldım, işte ne yaptım" diyorum ve beğenip beğenmediğinizi (veya SO için uygun olup olmadığını) benim için işe yaradı. Şimdi, geri dönüp soruyu daha spesifik hale getirirseniz, cevabım tamamen ilgisiz olacak.
Draghon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.