jQuery Ajax istekleri gönderilmeden iptal ediliyor


87

Microsoft'un Dünya Çapında Teleskop uygulamasına bir komut dosyası bağlamaya çalışıyorum. İkincisi, komutlar için 5050 numaralı bağlantı noktasını dinler. Tarayıcı ile aynı makinede çalışıyor (şu anda Chrome, ancak anlayabildiğim kadarıyla davranış Firefox 7 ve IE 9 ile aynı).

Sorunum olarak XSS kısıtlamalarını ortadan kaldırmaya çalışmak için orijinal html dosyasıyla bir "Access-Control-Allow-Origin: *" başlığı gönderiyorum.

WWT'ye erişim kodum aşağıdaki gibidir:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

bu durumda url "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ..." şeklindedir (tabii ki ... burada bazı ek parametreler için kısaltmadır).

Chrome'daki ağ teşhisine baktığımda şunu görebiliyorum:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

İstek çıkıyor - WWT'nin yeni bir katman oluşturduğunu görüyorum. Ancak, bir geri arama almıyorum. Çağrılan bir hata geri araması eklersem, ancak jqXHR nesnesindeki error özelliği yalnızca "error" ise ve durum 0 ise. Chrome'da ağ isteğine bakarsam, durum olarak "(iptal edildi)" görüyorum ve yanıt yok .

Aynı URL'yi alıp yeni bir tarayıcı sekmesine yapıştırırsam, yanıtın beklenen XML olduğunu görebilirim.

Tabii ki, buradaki bir fark, bunun bir POST değil bir GET olması, ancak bunu senaryomda denedim ve hiçbir fark yaratmıyor.

Bu beni oldukça şaşırttı ve yeni fikirleri takdir ediyorum.


errorBir hatayla geri dönüp dönmediğini görmek için geri aramayı işlemeyi denediniz mi?
StriplingWarrior

1
"Sorunum olarak XSS kısıtlamalarını ortadan kaldırmaya çalışmak için orijinal html dosyasıyla bir" Access-Control-Allow-Origin: * "başlığı gönderiyorum." Sunucunun Access-Control-Origin başlığını geri gönderdiğini mi söylüyorsunuz? Ya da Ajax talebiyle birlikte gönderiyorsunuz?
Jason Dean

sayfaya doğrudan url üzerinden erişmeyi deneyin ve herhangi bir çıkış yapıyor musunuz
zod

1
Evet, "" durum metni ve 0 koduyla bir hata geri araması alıyorum. Bu bir jQuery sorunu değil; Kodu düz bir XHR kullanarak yeniden yazdım ve aynı sonucu elde ediyorum - yani bir request.status sıfır ve boş bir request.responseText ile bir readyState 4. Access-Control-Allow-Origin başlığı sunucu tarafından gönderiliyor. Sayfaya doğrudan URL üzerinden erişim, beklenen XML yanıtını döndürür.
Graham Wheeler

Yanıtlar:


134

Başka biri bununla karşılaşırsa, sahip olduğumuz sorun, ajax isteğini bir bağlantıdan yapıyor olmamız ve bağlantının izlenmesini engellemememizdi. Dolayısıyla, bunu bir onclicköznitelikte yapıyorsanız , yaptığınızdan da emin olun return false;.


Bu benim için de çalıştı. Teşekkürler. OnClick işleyicimde neden yanlış döndürdüğümü unuttum ve bunu doğru olarak değiştirdim ve gönderinizi okuduktan sonra aniden aklıma geldi.
Shiprack

4
Ek olarak, bir form kullanıyorsanız return false, en sonunda onsubmitözniteliğini eklemeniz gerekir .
Jason Axelson

8
@VincentClyde "return false;", eylemi iptal etmek için formlar ve bağlantılar söyler. Bu, başlangıçta javascript form doğrulaması için tasarlanmıştı; burada bir doğrulama işlevi, form geçersizse yanlış döndürür ve formun gönderilmesini durdurur.
Tyzoid

13
Ayrıca kullanabilirsiniz e.preventDefault();nerede, eolduğu onclickolay parametresi.
Hannele

1
@Hannele event.preventDefault'u paylaştığınız için çok teşekkür ederiz. Buna çok ihtiyacım vardı. Bunu öneren başka bir cevap görmüyorum. Bunu ayrı bir cevap olarak göndermelisiniz.
Mohit

112

Chrome kullanıyorsanız, standart Chrome ağ panelinde bir (canceled)isteğin temel nedenini belirlemek için yeterli bilgi göremezsiniz .

chrome://net-internals/#eventsGizli yönlendirmeler / gönderilen çerezlerle ilgili güvenlik bilgileri vb. Dahil olmak üzere, gönderdiğiniz talebin kanlı ayrıntılarını size gösterecek olanı kullanmanız gerekir .

Örneğin, aşağıdaki ağ izlemesinde görmediğim bir yönlendirmeyi gösteriyor - çerezlerimin alt etki alanlarına gönderilmemesinden kaynaklanıyor:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)

Ayrıca (iptal edilmiş) bir sorunum var. @Ben, bu izi öğrenmek güzeldi, maalesef herhangi bir bilgi vermedi. Benim durumumda sunucu S3 ve klasörlerim klasörümde yapılandırılmış. Tek yaptığım bir görüntü için basit bir GET. Bir ağ panelinde Origin başlığına sahip bir istek görüyorum, ancak yanıt yok. Görünüşe göre Chrome, isteği sunucuya göndermeden önce iptal ediyor. Yönlendirme yok, https yok, içerik uzunluğu yok 0. Bütün gün kafamı becermek, hala bir gizem.
Gene Vayngrib

@GeneVayngrib Firefox'u deneyin - ağ hata ayıklayıcı doğrudan daha fazla bilgi gösterecektir - sorunu orada çözebilir ve ardından Chrome'da çalıştırabilirsiniz.
Ben Walding

@BenW teşekkür ederim, ancak Firefox'un Amazon S3'ten sunulan bu görüntüyle bir sorunu yok.
Gene Vayngrib

YUPP. Bu çok yardımcı oldu!
rubmz

23

Benim durumumda type='submit', formu gönderirken, ajax isabeti gitmeden önce sayfa yeniden yükleniyordu, bu yüzden basit bir çözüm olması gerekiyordu type="button". Bir tür belirtmezseniz submit, varsayılan olarak belirtmeniz gerekir;type="button"

type='submit' => type='button'

VEYA

Tür yok => type='button'


3
burada necro gönderi, bana stackoverflow dava açın. Tüm gün boyunca isteğimin neden konsoldan çalışıp senaryodan çalışmadığını araştırıyorum ve cevap buydu .. teşekkür ederim !!!
pcort

1
Giriş yaptım ve bu cevaba oy vermek için bu konuyu tekrar buldum !!, bu çok yardımcı oldu. saatlerce kafamı
dev

Jai shree krishna, umarım birçoklarının gelmesine yardımcı olur. Ve daha önce anlarlar.
Black Mamba

1
Bro bence sen tanrısın 😍😍
cosmicsage

6

Benzer bir problemim vardı. Benim durumumda, bir apache sunucusu + django üzerinde bir web hizmeti kullanmaya çalışıyorum (hizmet kendi başıma yazılmıştır). Ben de sizinle aynı çıktıyı alıyordum: Chrome, FF bunu tamamlarken iptal edildiğini söylüyor. Servise ajax yerine doğrudan tarayıcıdan erişmeyi deneseydim, bu da işe yarardı. Google'da gezinirken, apache'nin bazı yeni sürümlerinin yanıt başlıklarında yanıt uzunluğunu doğru şekilde ayarlamadığını öğrendim, bu yüzden bunu manuel olarak yaptım. Django ile tek yapmam gereken:

response['Content-Length'] = len(content)

Erişmeye çalıştığınız hizmet üzerinde kontrolünüz varsa, kullandığınız platformdaki yanıt başlığını nasıl değiştireceğinizi öğrenin, aksi takdirde bu sorunu gidermek için servis sağlayıcısına başvurmanız gerekir. Görünüşe göre, FF ve diğer pek çok tarayıcı bu durumu doğru bir şekilde idare edebiliyor, ancak Chrome tasarımcıları bunu belirtildiği gibi yapmaya karar verdi.


İçerik uzunluğu başlığını ayarlamayı denedim ve hala orijinal soruda açıklananla aynı sorunu yaşıyorum. PHP 5.3.8 ve Apache 2.2.21 kullanıyorum (Windows 7'de WAMP kullanıyorum)
rodrigo-silveira

4

Benzer bir sorun yaşadım. Chrome: // net-internals / # events kullanarak, sorunumun bazı sessiz yönlendirmelerden kaynaklandığını görebildim. Alma isteğim bir yükleme komut dosyasında tetikleniyordu. URL, " http://example.com/inner-path " biçimindeydi ve 301 kalıcı olarak "/ iç-yol" konumuna yeniden yönlendiriyordu. Sorunu çözmek için url'yi "/ iç yol" olarak değiştirdim ve bu sorunu çözdü. Hala bir hafta önce çalışan bir senaryonun neden birdenbire bana sorun çıkardığını bilmiyorum ... Umarım bu birine yardımcı olur


3

(Web Forms ASP.NET kullanarak)

Benim sorunum, Ajax'ı sunucu tarafı tıklama olayı kurulumuna sahip bir gönder düğmesinin tıklama olayını kapatmaya çalışıyordu. Düğmeyi sadece basit bir düğme yapmak zorunda kaldım (ör. <input type="button">)


3

Aynı sorunu yaşadım, benim için iframe'i geçici olarak oluşturuyordum ve ajax tamamlanmadan önce iframe'i kaldırıyordum, böylece tarayıcı ajax isteğimi iptal ediyordu.


Bu sorunu nasıl çözdünüz? Sitem benim tarafımdan kontrol edilmeyen bir iFrame'e gömülüyor.Bazı arka plan veri ayarlarını yaptığı için çağrımın tamamlanmasını istiyorum
Rips

@Rips bu 4 yıl önce, yine de Promises'i kullanarak çözdüğümü düşünüyorum
Reza

3

@ Kazetsukai'nin cevabını genişleterek, AJAX talebinizi bir bağlantıya tıklayarak kullanıcıdan yapıyorsanız bu sorunla karşılaşabilirsiniz.

Bağlantınızı böyle kurarsanız:

<a href="#" onclick="soAjax()">click me!</a>

Ve sonra aşağıdaki gibi bir javascript işleyicisi:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

Tarayıcınızın bağlantıyı takip etmesini ve devam eden istekleri iptal etmesini önlemek için , tıklama olayının yayılmasını eklemeniz return falseveya e.preventDefault()durdurmanız gerekir :

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

Veya:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}

2

AJAX isteği düştüğünde iki olasılık vardır (Cross-Origin isteği değilse):

  1. Etkinlik için öğenin varsayılan davranışını engellemiyorsunuz.
  2. AJAX zaman aşımını çok düşük ayarladınız veya ağ / uygulama arka uç sunucusu yavaş.

Çözüm 1) : Olay işleyicisine return false;veya ekleyin e.preventDefault();.

Çözüm 2) : AJAX talebini oluştururken zaman aşımı seçeneği ekleyin. Aşağıdaki örnek.

$.ajax({
    type: 'POST',
    url: url,
    timeout: 86400,
    data: data,
    success: success,
    dataType: dataType
});

Çapraz kaynaklı istekler için, Kaynaklar Arası Kaynak Paylaşımı (CORS) HTTP üstbilgilerini kontrol edin.


1

Https gerektiren bir url'ye http kullanarak istekte bulunurken bu hatayı aldım. Sanırım ajax çağrısı yeniden yönlendirmeyle ilgilenmiyor. CrossDomain ajax seçeneği true olarak ayarlanmış olsa bile durum budur (JQuery 1.5.2'de).


1

Dropzone.js durumu için. Benim durumumda, timeoutseçenek değerinin varsayılan olarak çok düşük olmasından kaynaklanıyordu . Öyleyse ihtiyaçlarınıza göre artırın.

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}

0

Benim durumumda, Apache'nin mod yeniden yazma özelliği url ile eşleşiyor ve isteği https'ye yönlendiriyordu.

Chrome: // net-internals / # events içindeki isteğe bakın.

İsteğin dahili günlüğünü gösterecektir. Yönlendirmeleri kontrol edin.


0

Aynı sorunu yaşadım, ancak benim durumumda bir çerez sorunu olduğu ortaya çıktı. Arka uçta çalışan kişiler, uygulamamızda oturum açtığımızda ayarlanan JSESSIONID tanımlama bilgisinin yolunu değiştirmişlerdi ve bilgisayarımda bu ada göre eski bir tanımlama bilgim vardı, ancak eski yol. Bu yüzden tarayıcıda oturum açmayı denediğimde (Chrome), sunucuya JSESSIONID adında, farklı değerlere sahip iki çerez gönderdi - ki bu anlaşılabilir bir şekilde kafasını karıştırdı - bu yüzden isteği iptal etti. Çerezleri bilgisayarımdan silmek sorunu çözdü.


0

Bu hatayı daha ürkütücü bir şekilde aldım: Ağ sekmesi ve chrome: // net-internals / # olayları, js tamamlandıktan sonra isteği göstermedi. Hata çağrısında js duraklatıldığında, ağ sekmesi isteği (iptal edildi) olarak gösterdi. Sürekli olarak, bir web sayfasındaki birkaç benzer istekten tam olarak biri (her zaman aynı) için çağrıldı. Chrome'u yeniden başlattıktan sonra hata tekrar yükselmedi!


0

Ben vardı Firefox'ta iptal . Bazı ajax aramaları benim için gayet iyi çalışıyordu, ama gerçekten kullanmak zorunda olan iş arkadaşım için başarısız oldu.

Bunu yukarıda belirtilen Chrome hileleriyle kontrol ettiğimde, şüpheli bir şey bulamadım. Firebug'da kontrol ederken, iki mallicous çağrısından sonra 'yükleme' animasyonunu gösterdi ve sonuç sekmesi yok.

Çözüm çok basitti: tarihe gidin, web sitesini bulun, sağ tıklayın -> web sitesini unutun.
Unutun, silmeyin.

Bundan sonra artık sorun yok. Tahminimce .htaccess ile bir ilgisi var.


0

Benim durumumda, url'deki eksik sondaki eğik çizgi idi. Sondaki eğik çizgiyi eklemek sorunumu çözdü.


-1

Bu sorunu belirli bir 3G ağıyla yaşadım.
Her zaman net_error = -101chrome: // net-internals / # olaylarında DELETE isteklerinde başarısız olur .

Diğer ağlar gayet iyi çalıştı, bu yüzden hatalı bir proxy sunucusu veya başka bir şey olduğunu varsayıyorum.

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.