รหัสสถานะ HTTP 0 - Error Domain = NSURLErrorDomain?


95

ฉันกำลังทำโปรเจ็กต์ iOS

ในแอปพลิเคชันนี้ฉันกำลังดาวน์โหลดภาพจากเซิร์ฟเวอร์

ปัญหา:

ในขณะที่ภาพการดาวน์โหลดฉันได้รับการร้องขอหมดเวลา ตามเอกสารรหัสสถานะ HTTP 408ของการร้องขอหมดเวลา

แต่ในแอปพลิเคชันของฉันฉันได้รับรหัสสถานะ HTTP 0พร้อมข้อผิดพลาดต่อไปนี้

Error Domain = NSURLErrorDomain Code = -1001 "การร้องขอหมดเวลา" UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSLocal requestizedDescription = The ., NSUnderlyingError = 0x13846870 "คำขอหมดเวลา"}

ในระหว่างการค้นหาทางอินเทอร์เน็ตฉันไม่พบข้อมูลเกี่ยวกับ HTTP Status Code 0

ใครช่วยอธิบายเรื่องนี้ให้ฉันฟังหน่อย


1
นอกจากนี้ยังอาจเกิดขึ้นเนื่องจากผู้พัฒนาเนื้อหาผสม.
mozilla.org/en-US/docs/Web/Security/Mixed_content

คำตอบ:


99

ไม่มีรหัสสถานะ HTTP 0 สิ่งที่คุณเห็นคือ 0 ที่ส่งคืนโดย API / ไลบรารีที่คุณใช้ คุณจะต้องตรวจสอบเอกสารสำหรับสิ่งนั้น


7
IE10 มีข้อผิดพลาดแปลก ๆ เมื่อได้รับรหัสสถานะ 401 หรือ 403 มันตีความว่าเป็นรหัสสถานะ 0 ในหัวของฉันรหัสสถานะ 0 เป็นข้อผิดพลาดเพราะเห็นได้ชัดว่ามีบางอย่างผิดปกติ
Gaui

5
การหมดเวลาทางประตูจะได้รับสถานะ 0 ในการเรียกกลับข้อผิดพลาด http ของคุณ, angulartutorial.net/2017/03/http-status-codes-and-meanings.html
Prashobh

คำตอบคือผิด รหัสสถานะ 0 มีอยู่เมื่อเบราว์เซอร์ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ เมื่อคุณได้รับข้อผิดพลาดที่แตกต่างกันเช่นเช่น 504 สิ่งนี้เกิดจากการตั้งค่าพร็อกซีย้อนกลับ
Nickon

คำตอบนั้นถูกต้อง ไม่มีรหัสสถานะ HTTP 0 คุณอาจเห็นว่าเป็นค่าส่งคืนจาก API แต่จะไม่เกิดขึ้นในข้อความตอบกลับ HTTP
Julian Reschke

77

รหัสสถานะเป็น 0 ในNSHTTPURLResponseวัตถุโดยทั่วไปหมายความว่าไม่มีการตอบสนองและอาจเกิดขึ้นได้จากหลายสาเหตุ เซิร์ฟเวอร์จะไม่ส่งคืนสถานะเป็น 0 เนื่องจากนี่ไม่ใช่รหัสสถานะ HTTP ที่ถูกต้อง

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

โปรดทราบว่าในกรณีที่รหัสสถานะเป็น 0 ข้อผิดพลาดจริงจะถูกจับในNSErrorวัตถุที่ส่งคืนไม่ใช่ไฟล์NSHTTPURLResponse.

สถานะ HTTP 408ค่อนข้างผิดปกติในประสบการณ์ของฉัน ฉันไม่เคยเจอด้วยตัวเอง แต่เห็นได้ชัดว่ามีการใช้ในกรณีที่ไคลเอนต์ต้องการรักษาการเชื่อมต่อซ็อกเก็ตที่ใช้งานอยู่กับเซิร์ฟเวอร์และเซิร์ฟเวอร์กำลังรอให้ไคลเอนต์ส่งข้อมูลเพิ่มเติมผ่านซ็อกเก็ตที่เปิดอยู่ แต่ไม่ได้อยู่ในช่วงเวลาที่กำหนดและ เซิร์ฟเวอร์ยุติการเชื่อมต่อด้วย408รหัสสถานะโดยบอกลูกค้าว่า "คุณใช้เวลานานเกินไป"


1
คำอธิบายที่สมบูรณ์แบบ
CouchDeveloper



6

รหัสสถานะ '0' อาจเกิดขึ้นได้เนื่องจากสาเหตุสามประการ
1) ไคลเอนต์ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์
2) ไคลเอนต์ไม่สามารถรับการตอบกลับภายในระยะหมดเวลา
3) การร้องขอถูก"หยุด (ยกเลิก)"โดยไคลเอนต์

แต่เหตุผลทั้งสามนี้ไม่ได้มาตรฐาน


1
คุณมีแหล่งที่มาหรือไม่?
rgoliveira

ซอร์สโค้ดใด ๆ สามารถใช้ได้กับการทดสอบสองจุดแรกคุณเพียงแค่ต้องมีคำขอตาม ajax แต่สิ่งที่ 3 กำลังเกิดขึ้นในการยกเลิกคำขอของผู้ใช้ซึ่งสามารถทำได้โดยยกเลิกฟังก์ชันใน jquery
Hariprasath Yadav

5

จากประสบการณ์ที่ จำกัด ของฉันฉันจะบอกว่าสองสถานการณ์ต่อไปนี้อาจทำให้เกิดการตอบสนองstatus code: 0ได้โปรดจำไว้ว่า พวกเขาอาจมีมากกว่านี้ แต่ฉันรู้สองคนนั้น:

  • การเชื่อมต่อของคุณอาจตอบสนองช้า
  • หรือเซิร์ฟเวอร์ส่วนหลังอาจไม่พร้อมใช้งาน

สิ่งนี้status: 0เป็นแบบทั่วไปเล็กน้อยและอาจเป็นกรณีการใช้งานมากกว่าที่เรียกใช้เนื้อหาตอบสนองที่ว่างเปล่า


เป็นสถานะ API ไม่ใช่สถานะ HTTP หากไม่มีการตอบสนอง HTTP แสดงว่าไม่มีรหัสสถานะ HTTP อยู่
user207421

รหัสสถานะ 0 ไม่ได้หมายความว่ามีรหัสตอบกลับ HTTP แต่อาจเป็นปัญหาหากเซิร์ฟเวอร์ของคุณไม่พร้อมใช้งาน
ราวี

4

การตอบสนอง HTTP 0 ไม่ใช่การตอบสนอง HTTP มาตรฐาน แต่มันบ่งชี้ว่าไคลเอนต์ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์และด้วยเหตุนี้จึงหมดเวลา


2

เราได้รับข้อผิดพลาด:

รับhttp: //localhost/pathToWebSite/somePage.aspxเพิ่มข้อผิดพลาด http.status: 0

การโทรนั้นทำจากงาน windows ที่เรียกไฟล์ VBS ดังนั้นเพื่อแก้ไขปัญหาชี้เบราว์เซอร์ไปที่ url และเราได้รับข้อผิดพลาดเกี่ยวกับความเป็นส่วนตัว:

การเชื่อมต่อของคุณไม่เป็นส่วนตัว

ผู้โจมตีอาจพยายามขโมยข้อมูลของคุณจาก localhost (เช่นรหัสผ่านข้อความหรือบัตรเครดิต) NET :: ERR_CERT_COMMON_NAME_INVALID

รายงานรายละเอียดของเหตุการณ์ด้านความปลอดภัยที่อาจเกิดขึ้นให้ Google โดยอัตโนมัติ นโยบายความเป็นส่วนตัวกลับสู่ความปลอดภัยเซิร์ฟเวอร์นี้ไม่สามารถพิสูจน์ได้ว่าเป็น localhost ใบรับรองความปลอดภัยมาจาก * .ourdomain.com ซึ่งอาจเกิดจากการกำหนดค่าผิดหรือผู้โจมตีขัดขวางการเชื่อมต่อของคุณ เรียนรู้เพิ่มเติม.

เนื่องจากเรามีกฎการเขียน URL IIS ที่ตั้งค่าให้บังคับให้การเชื่อมต่อใช้ https กฎนั้นเปลี่ยนhttp: // localhostเป็นhttps: // localhostแต่ใบรับรอง SSL ของเราใช้ชื่อโดเมนภายนอกที่ไม่ใช่ localhost ดังนั้นข้อผิดพลาดที่รายงานเป็นรหัสสถานะ 0 ดังนั้นข้อผิดพลาดความเป็นส่วนตัวอาจเป็นเหตุผลที่คลุมเครือ สำหรับรหัสสถานะนี้ 0

ในกรณีของเราวิธีแก้ปัญหาคือเพิ่มข้อยกเว้นให้กับกฎสำหรับ localhost และอนุญาตให้http: //localhost/pathToWebSite/somePage.aspxใช้ http ปิดบังใช่ แต่ฉันจะพบในปีหน้านี้และตอนนี้ฉันจะพบคำตอบของฉันในการค้นหาของ Google


2

บางครั้งเบราว์เซอร์จะตอบสนองต่อตัวจัดการข้อผิดพลาด http ด้วย Error Object ซึ่งมีสถานะเป็น 0 แม้ว่าคุณจะเห็นสถานะข้อผิดพลาด 404, 401, 500 เป็นต้นในเครือข่ายก็ตาม

สิ่งนี้อาจเกิดขึ้นได้หากแอปพลิเคชันและ API ของคุณอยู่ในโดเมนที่แตกต่างกัน - ใช้กลไก CORS ตาม CORS สำหรับเบราว์เซอร์คำขอ API แต่ละรายการจะส่งคำขอสองรายการ:

  1. ขอ OPTIONS ล่วงหน้าเพื่อทำความเข้าใจว่า API อนุญาตคำขอจริง / ต้นทางหรือไม่
  2. เมื่อ API อนุญาต (คำขอ OPTIOS ตอบสนองด้วยสถานะ 204 และส่วนหัว Access-Control-Allow-Origin ที่ถูกต้อง) - เบราว์เซอร์จะส่ง "คำขอ Actual / Origin" ถัดไป

ในแอปพลิเคชันเรากำลังจัดการการตอบสนองข้อผิดพลาดสำหรับ "คำขอ Actual / Origin" และหาก "คำขอของ OPTIONS preflight" ล้มเหลว - เบราว์เซอร์ไม่ได้ให้วัตถุ HttpError ที่ถูกต้องสำหรับตัวจัดการข้อผิดพลาด http ดังนั้นเพื่อให้ได้สถานะที่ถูกต้องของการตอบกลับ http - อย่าลืมตอบกลับคำขอ OPTIONS ของ OPTIONS สำเร็จ




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