คำขอ jQuery Ajax ถูกยกเลิกโดยไม่มีการส่ง


87

ฉันกำลังพยายามเชื่อมต่อสคริปต์กับแอป World-Wide Telescope ของ Microsoft ฟังก์ชั่นหลังบนพอร์ต 5050 สำหรับคำสั่ง มันทำงานบนเครื่องเดียวกับเบราว์เซอร์ (Chrome ตอนนี้ แต่เท่าที่ฉันสามารถบอกได้ว่าลักษณะการทำงานเหมือนกันกับ Firefox 7 และ IE 9)

ฉันกำลังส่งส่วนหัว "Access-Control-Allow-Origin: *" พร้อมไฟล์ html ดั้งเดิมเพื่อพยายามกำจัดข้อ จำกัด XSS ซึ่งเป็นปัญหาของฉัน

รหัสของฉันในการเข้าถึง WWT มีดังนี้:

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

url ในกรณีนี้คือ "http: //127.0.0.1: 5050 / layerApi.aspx? cmd = new & ... " (เห็นได้ชัดว่า ... เป็นชวเลขที่นี่สำหรับพารามิเตอร์เพิ่มเติมบางอย่าง)

เมื่อดูการวินิจฉัยเครือข่ายใน Chrome ฉันเห็นสิ่งนี้:

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

คำขอกำลังจะออก - ฉันเห็น WWT สร้างเลเยอร์ใหม่ อย่างไรก็ตามฉันไม่ได้รับการติดต่อกลับ หากฉันเพิ่มการเรียกกลับข้อผิดพลาดที่ถูกเรียก แต่คุณสมบัติข้อผิดพลาดบนวัตถุ jqXHR เป็นเพียง "ข้อผิดพลาด" และสถานะเป็น 0 หากฉันดูคำขอเครือข่ายใน Chrome ฉันเห็น "(ยกเลิก)" เป็นสถานะและไม่มีการตอบสนอง .

หากฉันใช้ URL เดียวกันนั้นและวางในแท็บเบราว์เซอร์ใหม่ฉันจะเห็นว่าการตอบสนองเป็น XML ที่คาดไว้

แน่นอนความแตกต่างที่นี่คือ GET ไม่ใช่ POST แต่ฉันได้ลองใช้ในสคริปต์ของฉันแล้วและมันก็ไม่แตกต่างกัน

ฉันค่อนข้างนิ่งงันกับสิ่งนี้และจะขอบคุณความคิดใหม่ ๆ


คุณได้ลองจัดการการerrorโทรกลับเพื่อดูว่ามีข้อผิดพลาดหรือไม่?
StriplingWarrior

1
"ฉันกำลังส่งส่วนหัว" Access-Control-Allow-Origin: * "พร้อมไฟล์ html ดั้งเดิมเพื่อพยายามกำจัดข้อ จำกัด XSS ให้เป็นปัญหาของฉัน" คุณหมายความว่าเซิร์ฟเวอร์กำลังส่งส่วนหัว Access-Control-Origin กลับมาใช่หรือไม่? หรือว่าคุณจะส่งไปพร้อมกับคำขอของ Ajax?
Jason Dean

ลองเข้าถึงหน้าโดยตรงผ่าน url และดูว่าคุณได้รับประโยชน์หรือไม่
zod

1
ใช่ฉันได้รับข้อผิดพลาดในการติดต่อกลับพร้อมข้อความสถานะ "" และรหัส 0 นี่ไม่ใช่ปัญหา jQuery ฉันเขียนโค้ดใหม่โดยใช้ XHR แบบตรงและได้ผลลัพธ์เดียวกันนั่นคือ readyState เป็น 4 พร้อมด้วย request.status เป็นศูนย์และ request.responseText ว่างเปล่า เซิร์ฟเวอร์จะส่งส่วนหัว Access-Control-Allow-Origin การเข้าถึงเพจโดยตรงผ่าน URL จะส่งคืนการตอบสนอง XML ที่คาดไว้
Graham Wheeler

คำตอบ:


134

หากมีใครพบปัญหานี้ปัญหาที่เราพบคือเรากำลังส่งคำขอ ajax จากลิงก์และไม่ได้ป้องกันไม่ให้ติดตามลิงก์ ดังนั้นหากคุณทำสิ่งนี้ในonclickแอตทริบิวต์อย่าลืมทำreturn false;เช่นกัน


สิ่งนี้ได้ผลสำหรับฉันด้วย ขอบคุณ. ฉันลืมไปแล้วว่าทำไมฉันถึงส่งคืนเท็จในตัวจัดการ onClick ของฉันและเปลี่ยนเป็นจริงและหลังจากอ่านโพสต์ของคุณแล้วมันก็เริ่มต้นขึ้นกับฉัน
Shiprack

4
นอกจากนี้หากคุณกำลังใช้แบบฟอร์มคุณจำเป็นต้องเพิ่มแอตทริบิวต์return falseที่ส่วนท้ายของคุณ onsubmit
Jason Axelson

8
@VincentClyde "return false;"บอกแบบฟอร์มและลิงก์เพื่อยกเลิกการดำเนินการ เดิมมีไว้สำหรับการตรวจสอบความถูกต้องของรูปแบบจาวาสคริปต์ซึ่งฟังก์ชันตรวจสอบความถูกต้องจะส่งคืนเท็จหากแบบฟอร์มไม่ถูกต้องซึ่งจะหยุดการส่งแบบฟอร์ม
Tyzoid

13
นอกจากนี้คุณยังสามารถใช้e.preventDefault();ที่eเป็นonclickพารามิเตอร์เหตุการณ์
Hannele

1
@Hannele ขอบคุณมากสำหรับการแบ่งปัน event.preventDefault ฉันต้องการมันแย่มาก ฉันไม่เห็นคำตอบอื่นใดที่แนะนำสิ่งนี้ คุณควรโพสต์เป็นคำตอบแยกต่างหาก
Mohit

112

หากคุณใช้ Chrome คุณไม่เห็นข้อมูลเพียงพอในแผงเครือข่าย Chrome มาตรฐานเพื่อระบุสาเหตุที่แท้จริงของ(canceled)คำขอ

คุณจำเป็นต้องใช้chrome://net-internals/#eventsซึ่งจะแสดงรายละเอียดที่เต็มไปด้วยเลือดของคำขอที่คุณกำลังส่งรวมถึงการเปลี่ยนเส้นทาง / ข้อมูลความปลอดภัยที่ซ่อนอยู่เกี่ยวกับคุกกี้ที่ถูกส่งเป็นต้น

เช่นรายการต่อไปนี้แสดงการเปลี่ยนเส้นทางที่ฉันไม่เห็นในการติดตามเครือข่ายซึ่งเกิดจากคุกกี้ของฉันไม่ถูกส่งข้ามโดเมนย่อย:

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)

ฉันมีปัญหา (ยกเลิก) ด้วย @ เบ็นมันเยี่ยมมากที่ได้เรียนรู้เกี่ยวกับร่องรอยนี้น่าเสียดายที่มันไม่ได้ให้ข้อมูลใด ๆ เซิร์ฟเวอร์ในกรณีของฉันคือ S3 และ cors ถูกกำหนดค่าในที่เก็บข้อมูลของฉัน สิ่งที่ฉันทำคือรับภาพง่ายๆ ฉันเห็นคำขอที่มีส่วนหัว Origin ในแผงเครือข่าย แต่ไม่มีการตอบกลับ เห็นได้ชัดว่า Chrome ยกเลิกคำขอก่อนที่จะส่งไปยังเซิร์ฟเวอร์ ไม่มีการเปลี่ยนเส้นทางไม่มี https ไม่มีความยาวของเนื้อหา 0. กระแทกหัวฉันทั้งวันยังคงเป็นปริศนา
Gene Vayngrib

@GeneVayngrib ลองใช้ Firefox - ดีบักเกอร์เครือข่ายจะแสดงข้อมูลเพิ่มเติมโดยตรง - คุณอาจสามารถแก้ไขปัญหาได้ที่นั่นจากนั้นให้มันใช้งานได้ใน Chrome
Ben Walding

@BenW ขอบคุณ แต่ Firefox ไม่มีปัญหากับภาพนี้ที่ให้บริการจาก Amazon S3
Gene Vayngrib

YUPP. นั่นช่วยได้มาก!
rubmz

23

ในกรณีของฉันฉันมีดังนั้นเมื่อผมได้รับการส่งแบบฟอร์มหน้าเว็บถูกโหลดก่อนที่อาแจ็กซ์ตีไปเพื่อแก้ปัญหาที่ง่ายคือการมีtype='submit' type="button"หากคุณไม่ระบุประเภทเป็นsubmitค่าเริ่มต้นดังนั้นคุณต้องระบุtype="button"

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

หรือ

ไม่มีประเภท => type='button'


3
necro โพสต์ที่นี่ฟ้องฉัน stackoverflow ฉันค้นหาสูงและต่ำตลอดทั้งวันว่าทำไมคำขอของฉันถึงใช้งานได้จากคอนโซล แต่ไม่ใช่สคริปต์และนี่คือคำตอบ .. ขอบคุณ !!!
pcort

1
ฉันเข้าสู่ระบบและพบกระทู้นี้อีกครั้งเพื่อโหวตคำตอบนี้ !! สิ่งนี้ช่วยได้มาก ทำลายหัวของฉันเป็นเวลาหลายชั่วโมง
dev

Jai shree krishna หวังว่าจะช่วยให้หลาย ๆ คนมา และพวกเขาคิดออกก่อนหน้านี้
Black Mamba

1
พี่ชายฉันคิดว่าคุณคือพระเจ้า😍😍
cosmicsage

6

ฉันมีปัญหาที่คล้ายกัน ในกรณีของฉันฉันกำลังพยายามใช้บริการเว็บบนเซิร์ฟเวอร์ apache + django (บริการนี้เขียนขึ้นเอง) ฉันมีผลลัพธ์เดียวกันกับคุณ: Chrome บอกว่ามันถูกยกเลิกในขณะที่ FF ไม่เป็นไร หากฉันพยายามเข้าถึงบริการโดยตรงบนเบราว์เซอร์แทนที่จะใช้ ajax มันก็ใช้ได้เช่นกัน Googling ไปรอบ ๆ ฉันพบว่า apache เวอร์ชันใหม่บางรุ่นไม่ได้ตั้งค่าความยาวของการตอบกลับอย่างถูกต้องในส่วนหัวการตอบกลับดังนั้นฉันจึงทำสิ่งนี้ด้วยตนเอง ด้วย django สิ่งที่ฉันต้องทำคือ:

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

หากคุณสามารถควบคุมบริการที่คุณพยายามเข้าถึงได้ให้ดูวิธีแก้ไขส่วนหัวการตอบกลับในแพลตฟอร์มที่คุณใช้ไม่เช่นนั้นคุณจะต้องติดต่อผู้ให้บริการเพื่อแก้ไขปัญหานี้ เห็นได้ชัดว่า FF และเบราว์เซอร์อื่น ๆ อีกมากมายสามารถจัดการกับสถานการณ์นี้ได้อย่างถูกต้อง แต่นักออกแบบ Chrome ตัดสินใจที่จะทำตามที่ระบุไว้


ฉันลองตั้งค่าส่วนหัวความยาวของเนื้อหาแล้ว แต่ยังคงพบปัญหาเดิมตามที่อธิบายไว้ในคำถามเดิม ฉันใช้ PHP 5.3.8 และ Apache 2.2.21 (ใช้ WAMP ใน Windows 7)
rodrigo-silveira

4

ฉันมีปัญหาที่คล้ายกัน การใช้ chrome: // net-internals / # เหตุการณ์ฉันพบว่าปัญหาของฉันเกิดจากการเปลี่ยนเส้นทางที่ไม่มีการโต้ตอบ คำขอรับของฉันถูกเรียกใช้ในสคริปต์การโหลด URL อยู่ในรูปแบบ " http://example.com/inner-path " และ 301 เปลี่ยนเส้นทางไปที่ "/ inner-path" อย่างถาวร เพื่อแก้ไขปัญหานี้ฉันเพิ่งเปลี่ยน url เป็น "/ inner-path" และนั่นก็ช่วยแก้ปัญหาได้ ฉันยังไม่รู้ว่าเหตุใดสคริปต์ที่ใช้งานได้เมื่อสัปดาห์ก่อนจึงทำให้ฉันมีปัญหาขึ้นมา ... หวังว่านี่จะช่วยใครบางคนได้


3

(ใช้เว็บฟอร์ม ASP.NET)

ปัญหาของฉันคือฉันพยายามทำให้ Ajax ปิดเหตุการณ์การคลิกของปุ่มส่งที่มีการตั้งค่าเหตุการณ์คลิกฝั่งเซิร์ฟเวอร์ ฉันต้องทำให้ปุ่มเป็นเพียงปุ่มธรรมดา (เช่น<input type="button">)


3

ฉันมีปัญหาเดียวกันสำหรับฉันฉันกำลังสร้าง iframe สำหรับลักษณะชั่วคราวและฉันกำลังลบ iframe ก่อนที่ ajax จะเสร็จสมบูรณ์ดังนั้นเบราว์เซอร์จะยกเลิกคำขอ ajax ของฉัน


คุณแก้ปัญหานี้ได้อย่างไรไซต์ของฉันถูกฝังใน iFrame ที่ฉันไม่ได้ควบคุมฉันต้องการให้การโทรของฉันเสร็จสมบูรณ์เนื่องจากมีการตั้งค่าข้อมูลพื้นหลังบางอย่าง
Rips

@Rips นี้เป็นเวลา 4 ปีที่แล้วอย่างไรก็ตามฉันคิดว่าฉันแก้ไขได้โดยใช้ Promises
Reza

3

เมื่อขยายคำตอบของ @ Kazetsukai คุณอาจพบปัญหานี้หากคุณกำลังส่งคำขอ AJAX จากผู้ใช้คลิกที่ลิงค์

หากคุณตั้งค่าลิงก์ของคุณดังนี้:

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

จากนั้นตัวจัดการ javascript ดังต่อไปนี้:

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

เพื่อป้องกันไม่ให้เบราว์เซอร์ของคุณติดตามลิงก์และยกเลิกคำขอใด ๆ ที่อยู่ระหว่างดำเนินการคุณควรเพิ่มreturn falseหรือe.preventDefault()หยุดไม่ให้เผยแพร่เหตุการณ์การคลิก:

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

หรือ:

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

2

มีความเป็นไปได้สองประการเมื่อคำขอ AJAX ลดลง (หากไม่ใช่คำขอข้ามแหล่งกำเนิด):

  1. คุณไม่ได้ป้องกันพฤติกรรมเริ่มต้นขององค์ประกอบสำหรับเหตุการณ์
  2. คุณตั้งค่าระยะหมดเวลาของ AJAX ต่ำเกินไปหรือเซิร์ฟเวอร์แบ็กเอนด์เครือข่าย / แอปพลิเคชันทำงานช้า

โซลูชันสำหรับ 1) : เพิ่มreturn false;หรือe.preventDefault();ในตัวจัดการเหตุการณ์

โซลูชันสำหรับ 2) : เพิ่มตัวเลือกการหมดเวลาขณะสร้างคำขอ AJAX ตัวอย่างด้านล่าง

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

สำหรับคำขอข้ามแหล่งที่มาให้ตรวจสอบส่วนหัว HTTP Cross-Origin Resource Sharing (CORS)


1

ฉันได้รับข้อผิดพลาดนี้เมื่อทำการร้องขอโดยใช้ http ไปยัง url ที่ต้องการ https ฉันเดาว่าการโทรของ ajax ไม่ได้จัดการการเปลี่ยนเส้นทาง เป็นกรณีนี้แม้จะมีการตั้งค่าอ็อพชัน crossDomain ajax เป็น true (บน JQuery 1.5.2)


1

สำหรับกรณี Dropzone.js ในกรณีของฉันมันเกิดจากค่าtimeoutตัวเลือกต่ำเกินไปโดยค่าเริ่มต้น ดังนั้นเพิ่มตามความต้องการของคุณ

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

0

ในกรณีของฉันการเขียนซ้ำ mod ของ Apache ตรงกับ url และเปลี่ยนเส้นทางคำขอไปที่ https

ดูคำขอใน chrome: // net-internals / # events

จะแสดงบันทึกภายในของคำขอ ตรวจสอบการเปลี่ยนเส้นทาง


0

ฉันมีปัญหาเดียวกัน แต่ในกรณีของฉันมันกลายเป็นปัญหาคุกกี้ พวกที่ทำงานในส่วนหลังได้เปลี่ยนเส้นทางของคุกกี้ JSESSIONID ที่ตั้งไว้เมื่อเราเข้าสู่ระบบแอปของเราและฉันมีคุกกี้เก่าที่ใช้ชื่อนั้นในคอมพิวเตอร์ของฉัน แต่ใช้เส้นทางเก่า ดังนั้นเมื่อฉันพยายามเข้าสู่ระบบในเบราว์เซอร์ (Chrome) ได้ส่งคุกกี้สองตัวที่เรียกว่า JSESSIONID ซึ่งมีค่าต่างกันไปยังเซิร์ฟเวอร์ซึ่งเข้าใจได้ว่าสับสนดังนั้นจึงยกเลิกคำขอ การลบคุกกี้ออกจากคอมพิวเตอร์ของฉันแก้ไขได้


0

ฉันพบข้อผิดพลาดนี้ในลักษณะที่น่ากลัวมากขึ้น: แท็บเครือข่ายและเหตุการณ์ chrome: // net-internals / # ไม่แสดงคำขอหลังจาก js เสร็จสมบูรณ์ เมื่อหยุด js ในข้อผิดพลาด callcack แท็บเครือข่ายแสดงคำขอเป็น (ยกเลิก) มีการเรียกคำขอหนึ่งรายการ (เหมือนกันเสมอ) ของคำขอที่คล้ายกันหลายรายการในหน้าเว็บ หลังจากรีสตาร์ท Chrome ข้อผิดพลาดไม่เกิดขึ้นอีก!


0

ฉันได้ยกเลิกใน FirefoxFirefox การโทร ajax บางตัวทำงานได้ดีสำหรับฉัน แต่มันล้มเหลวสำหรับเพื่อนร่วมงานที่ต้องใช้มันจริงๆ

เมื่อฉันตรวจสอบสิ่งนี้ผ่านเทคนิคของ Chrome ที่กล่าวถึงข้างต้นฉันไม่พบสิ่งที่น่าสงสัย เมื่อตรวจสอบใน firebug จะแสดงภาพเคลื่อนไหว "กำลังโหลด" หลังจากการเรียกที่เป็นสัญลักษณ์สองครั้งและไม่มีแท็บผลลัพธ์

วิธีแก้ปัญหานั้นง่ายมาก: ไปที่ประวัติค้นหาเว็บไซต์คลิกขวา -> ลืมเว็บไซต์
ลืมไม่ลบ.

หลังจากนั้นก็ไม่มีปัญหาอีกต่อไป ฉันเดาว่ามันเกี่ยวข้องกับ. htaccess


0

ในกรณีของฉันมันเป็นเครื่องหมายทับที่ขาดหายไปใน url การเพิ่มเครื่องหมายทับช่วยแก้ปัญหาของฉันได้


-1

ฉันมีปัญหานี้กับเครือข่าย 3G เฉพาะ
มันมักจะล้มเหลวในการร้องขอ DELETE ด้วยnet_error = -101ใน chrome: // net-internals / # events

เครือข่ายอื่น ๆ ทำงานได้ดีดังนั้นฉันจึงถือว่ามีพร็อกซีเซิร์ฟเวอร์ผิดพลาดหรือมีบางอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.