2015-07-20 25 views
11

Tôi gặp sự cố lạ khi tôi sử dụng API của mình từ ứng dụng của mình. Đôi khi, không có lý do, yêu cầu được chỉ không được gửi, và nó không thành công vào cuối của time-out với các lỗi sau:Yêu cầu không được gửi

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." 

Tôi đã thử nhiều API như NSURLConnection đại biểu, NSURLSessionNSURLConnection.sendSynchronousRequest không sự thành công.

Đây là dự án mẫu tôi đã thực hiện để làm nổi bật vấn đề. ConnectionBugApp

Dưới đây là các bước để tái sản xuất:

  • Chạy ứng dụng trong Xcode và dừng debug chỉ để ứng dụng trên điện thoại của bạn
  • mở ứng dụng, nhấp Test Connection (nó thành công, bánh xe tải dừng quay ngay sau)
  • Chuyển đến các ứng dụng khác như trò chơi trên mạng/facebook/mạng (somes hơi nặng) và chuyển sang chế độ trên máy bay vài lần
  • Quay lại ứng dụng của tôi và nhấp Kiểm tra kết nối (tải bánh xe không bao giờ dừng)

Một vài chi tiết có thể giúp:

  • Nếu tôi sử dụng IP máy chủ của tôi thay cho tên miền của tôi, nó thành công

  • Issue chỉ xuất hiện khi trên mạng LTE/4G

Bất kỳ ý tưởng hoặc giải pháp nào đều sẽ được đánh giá cao! Vui lòng hỏi thêm chi tiết.

Cảm ơn

EDIT

Tôi đã chỉnh sửa mô tả rất nhiều kể từ khi tôi lần đầu tiên đăng nó (hy vọng trở nên sáng sủa và rõ ràng hơn), tôi xin lỗi nếu số câu trả lời hoặc bình luận don' t thực sự có ý nghĩa nữa.

+0

Nếu bạn sử dụng API NSURLSession, sự cố có tái tạo không? –

+0

@LeoNatan, yep Tôi có cùng một vấn đề với 'NSURLSession' – streem

+0

Bạn thấy gì ở phía máy chủ? Bạn có thấy máy chủ chấp nhận kết nối máy khách hoặc thậm chí không đến được máy chủ không? Tôi muốn nói nó giống như một nơi nào đó trong máy chủ của bạn, bạn đang bỏ kết nối. Một bức tường lửa có lẽ. –

Trả lời

2

Như đã đề cập trong nhận xét, tôi đã bật DNSSEC (bảo vệ ngộ độc bộ nhớ cache) trên dịch vụ lưu trữ của mình.

Tắt tính năng này, khắc phục sự cố, mặc dù đó có thể không phải là giải pháp thực sự tốt đẹp. Sau một vài tuần tìm kiếm, điều đó sẽ đủ tốt.

Tôi sẽ tặng tiền thưởng cho người nào đó có thể giải thích hoặc có thể cung cấp giải pháp tốt hơn.

+0

"Gói DNSSEC có thể bị từ chối vì kích thước phản hồi quá lớn." Kiểm tra liên kết http://www.cisco.com/web/about/security/intelligence/dnssec.html Đây có thể là lý do. – Karlos

0

Hãy thử mã sau cho kết nối. Điều này sẽ giúp bạn.

 let urlData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error) 

      if error != nil || urlData!.length == 0 
      { 
       println("Error happend timeout======\(error?.code)!") 

       continue 
      } 
      else //else1 
      {if let httpResponse = response as? NSHTTPURLResponse 
       { 
        println("Status Code for successful---\(httpResponse.statusCode)") 

        // For example 502 is for Bad Gateway 
        if (httpResponse.statusCode == 502) 
        { 
         // Check the response code from your server and break 
         break 
        } 
        else 
        { 

         //Your code 
        } 
      } 
    } 

Bạn có thể lấy danh sách các mã trạng thái HTTPS trong liên kết sau StatusCode

+0

Cảm ơn câu trả lời của bạn, tôi không chắc chắn về lý do bạn đăng mã này và tiếc là tôi có cùng một vấn đề với nó. – streem

+0

Tôi đã thử ConnectionBugApp trên kết nối LTE/4G và nó hoạt động tốt cho URL "https://tripaff.com/" và "https://meetsam.co/". Tôi gặp lỗi 503 cho "http://ip.jsontest.com/" Url. – Karlos

+0

Hmm, bạn đã thử sau khi sử dụng mạng mạnh mẽ trên các ứng dụng khác chưa? Bạn cũng có thể thử bằng cách quên ứng dụng trong vài giờ và chỉ cần nhấn nút Thử kết nối lần nữa sau. – streem

2

Tôi đã gặp vấn đề này khi sử dụng một yêu cầu không đồng bộ. Dường như iOS giới hạn số lượng kết nối mở đến một tên miền duy nhất, sao cho tất cả các kết nối tiếp theo đều thất bại theo cách bạn đã mô tả.

Nếu kết nối thường hoàn thành nhanh chóng, điều này có thể không phải là vấn đề.

Giải pháp là giới hạn số lượng kết nối mở cho cùng một miền để ngăn điều này xảy ra.

Câu trả lời được đăng bởi karlos hoạt động vì tính đồng bộ của kết nối chặn những người khác đang mở.

+0

Cảm ơn câu trả lời của bạn, đề xuất karlos không hoạt động. Nếu tôi cũng có thể thêm, tôi có một tiêu đề 'Connection: close' trong mỗi phản hồi và tôi tin rằng đó là sự thật rằng tôi sử dụng các ứng dụng khác làm cho yêu cầu không đi. Giống như nếu hệ điều hành đặt ứng dụng của tôi và kết nối của nó ở chế độ nền và quên đánh thức nó. – streem

+0

Bạn đã thử thêm thời gian chờ cho yêu cầu https chưa? – Karlos

+0

Bạn có nghĩa là khi tôi bắt đầu yêu cầu của tôi? có, nó có thời gian chờ 120 giây. – streem

1

Trong mã của bạn, yêu cầu của bạn mất thời gian chờ mặc định là 60, nhưng bạn có thể thay đổi Thời gian yêu cầu trong mã của bạn như bên dưới.

trong thời gian thay đổi lớp học NetworkItem của bạn.

init(request:NSMutableURLRequest){ 
    self.request = request 
    self.request.timeoutInterval = 120 
    super.init() 
} 
+0

Cảm ơn câu trả lời của bạn, nhưng đây không phải là vấn đề thời gian chờ. Khi nó không thành công, nó luôn luôn thất bại vào cuối thời gian chờ bất kỳ thời gian đó là. – streem

Các vấn đề liên quan