2009-03-05 34 views
8

Tôi có một ứng dụng web và sử dụng ajax để gọi lại cho máy chủ web của tôi để tìm nạp dữ liệu.IE treo trong 5 phút khi gọi đồng bộ xmlhttprequest

(những khoảnh khắc tại chứ không phải không thể đoán trước, nhưng nó có thể được sao chép) Đôi khi IE bị treo hoàn toàn trong vòng 5 phút (cửa sổ nói Not Responding) và sau đó trở lại và đối tượng XMLHttpRequest đáp ứng với lỗi 12002.

Con đường tôi có thể tái tạo nó như sau.

  1. mở cửa sổ (B) từ cửa sổ chính (A) sử dụng nút
  2. Window Một gọi ajax đồng bộ (PROC1) khi button được click để mở cửa sổ B. PROC1 Chạy tập tin.
  3. Cửa sổ mới (B) có mã ajax (PROC2) và máy chủ cuộc gọi không đồng bộ. Chạy tốt
  4. Người dùng đóng cửa sổ B sau khi PROC2 hoàn tất nhưng trước khi dữ liệu được trả về.
  5. Trong cửa sổ chính (a) người dùng nhấp vào nút một lần nữa. PROC1 chạy một lần nữa nhưng bây giờ gửi các khối gọi() trong 5 phút.

Vui lòng trợ giúp. Tôi đã tìm kiếm 3 ngày.

Xin lưu ý: * Tôi không thể kiểm tra nó trong firefox (ứng dụng không phải là firefox tương thích) * Tôi sử dụng cuộc gọi đồng bộ (đó là cách ứng dụng được xây dựng và nó sẽ mất quá nhiều nhà phát triển nỗ lực để viết lại)

Tại sao điều này xảy ra và cách khắc phục sự cố này?

+0

Chỉ cần một gợi ý , nhưng sử dụng Process Explorer và Process Monitor để có được một ý tưởng những gì đang diễn ra 'dưới mui xe '? – Terry

Trả lời

1

Winsock Lỗi 12.002 có nghĩa như sau theo msdn

ERROR_INTERNET_TIMEOUT 

12002 

The request has timed out. 

Winsock là đối tượng chuyển ổ cắm cơ bản cho XMLHTTP trong IE vì vậy bất kỳ lỗi thats không trong phạm vi lỗi HTTP (300.400.500 vv) là gần như luôn luôn là một winsock lỗi.

Điều không rõ ràng từ câu hỏi của bạn là wheter cùng một tài nguyên đang được truy vấn vào vòng thứ hai. Bạn có thể buộc một tài nguyên không bị gián đoạn mới bằng cách thêm:

'?uid=+'Math.random() 

Đến URL có thể giải quyết vấn đề.

giải pháp khác có thể là đính kèm một hàm vào sự kiện "onbeforeunload" trên đối tượng cửa sổ để gọi hủy bỏ() một yêu cầu XMLHTTP đang hoạt động ngay trước khi cửa sổ B bị đóng.

Hy vọng 2 con trỏ này sẽ giải quyết được lỗi của bạn.

2

Cảm ơn bạn đã trả lời Martijn.

Nó không giải quyết được sự cố của tôi. Tôi nghĩ những gì tôi thấy được mô tả tốt nhất trên trang web này: http://bytes.com/groups/javascript/643080-ajax-crashes-ie-close-window

Trong trường hợp của tôi, kết nối không ổn định hoặc máy chủ web chậm và khi kết nối quá chậm và trình duyệt và máy chủ web vẫn có kết nối đóng băng.

7

Bạn nói đúng Jaap, điều này liên quan đến giới hạn kết nối của Internet Explorer là 2.Đối với một số lý do, IE không phát hành các kết nối với các yêu cầu AJAX được thực hiện trong các cửa sổ đã đóng.

Tôi có một tình hình rất giống nhau, chỉ hơi đơn giản:

  • nhấp chuột của người dùng trong Window A đến mở cửa sổ B
  • Window B thực hiện một cuộc gọi Ajax mà mất một thời gian
  • Trước khi trở về cuộc gọi Ajax , người dùng đóng cửa sổ B. Kết nối với cuộc gọi này "rò rỉ".
  • Lặp lại thêm 1 thời gian cho đến khi cả hai kết nối có sẵn được "rò rỉ"
  • trình duyệt trở nên bất tỉnh

Một kỹ thuật mà bạn có thể thử (được đề cập trong bài viết bạn tìm thấy) mà dường như để làm việc là để hủy bỏ việc XMLHTTP yêu cầu trong sự kiện dỡ hàng của trang.

Vì vậy, một cái gì đó như:

var xhr = null; 

function unloadPage() { 
    if(xhr !== null) { 
    xhr.abort(); 
    } 
} 

Một lựa chọn khác là sử dụng đồng bộ các cuộc gọi AJAX, mà sẽ ngăn chặn cho đến khi trở về cuộc gọi, về cơ bản khóa trình duyệt. Điều này có thể hoặc có thể không được chấp nhận cho tình huống cụ thể của bạn.

// the 3rd param is whether the call is asynchronous 
xhr.open('get', 'url', false); 

Cuối cùng, như đã đề cập ở nơi khác, bạn có thể điều chỉnh số lượng kết nối tối đa mà IE sử dụng trong sổ đăng ký. Mong rằng khách truy cập vào trang web của bạn thực hiện điều này tuy nhiên không thực tế và nó sẽ không thực sự giải quyết được vấn đề - chỉ cần trì hoãn nó xảy ra. Như một lưu ý phụ, IE8 sẽ cho phép 6 kết nối đồng thời.

+0

Tôi đã sử dụng một giải pháp hủy bỏ để sửa chữa một vấn đề rất giống nhau trong IE8 với ajax và mở và đóng cửa sổ. Tuy nhiên, để hủy bỏ và không bị mất các phản ứng tôi đã tìm kiếm tôi đã phải sử dụng async: false trong jQuery. Điều này là tốt trong trường hợp của tôi, nhưng rõ ràng là không lý tưởng. Tuy nhiên, hủy bỏ đã giải quyết vấn đề cửa sổ trống mới. Xem nhận xét của tôi trong http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jquery để biết thêm chi tiết. –

2

Theo mặc định Internet Explorer chỉ cho phép hai kết nối đồng thời vào cùng một trang web cho mục đích tải xuống. Nếu bạn cố gắng và bắn nhiều hơn thế này, I.E. quầy hàng cho đến khi một trong các yêu cầu trước đó kết thúc vào thời điểm đó yêu cầu tiếp theo sẽ hoàn thành. Tôi tin rằng (mặc dù tôi có thể sai) điều này đã được đưa ra để ngăn chặn quá tải các trang web với nhiều tải đồng thời tại một thời điểm. Có một đăng ký hack để phá vỡ khóa này.

tôi tìm thấy những hướng dẫn này đá trên internet mà giảm bớt vấn đề của tôi - Tôi không thể hứa hẹn nó sẽ làm việc cho tình hình của bạn, nhưng đa kết nối hạn chế bạn đang phải đối mặt xuất hiện liên quan:

  1. Nhấp vào nút Start và chọn Run.
  2. Trên dòng chạy loại Regedt32.exe và nhấn Enter. Thao tác này sẽ khởi chạy Trình chỉnh sửa đăng ký
  3. Tìm khóa sau trong sổ đăng ký: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  4. Nhấp vào Khóa cài đặt Internet.
  5. Bây giờ hãy vào menu Edit, chọn NEW
  6. nhấp chuột DWORD Value
  7. Loại MaxConnectionsPer1_0Server cho tên của DWORD Value này.
  8. Nhấp đúp vào phím MaxConnectionsPer1_0Server bạn vừa tạo và nhập thông tin sau: Dữ liệu giá trị: 10. Cơ sở: Thập phân.
  9. Khi hoàn tất, nhấn OK.
  10. Lặp lại bước 4 đến 9. Lần này đặt tên phím MaxConnectionsPerServer và gán cho nó giá trị tương tự như đã nêu trong bước 8.
  11. Khi xong nhấn OK
  12. Đóng cửa sổ Registry Editor.

Tất nhiên, tôi sẽ sử dụng các lệnh này cùng với lệnh abort() đã đề cập trước đây. Song song, họ nên khắc phục vấn đề.

2

IE5 và IE6, thực sự, treo khi cố gắng nhận dữ liệu từ tập lệnh PHP. Lý do là các trình duyệt này không thể quyết định khi đã nhận được tất cả dữ liệu và kết nối có thể được đóng lại. Vì vậy, họ chờ đợi cho đến khi kết nối hết hạn (do đó, 5 hoặc 10 phút treo). Một cách để giải quyết điều này là cho trình duyệt biết lượng dữ liệu sẽ nhận được. Trong PHP, bạn có thể làm điều đó bằng cách sử dụng bộ đệm đầu ra, ví dụ như sau:

ob_start(); 
echo $html_content; 
header('Connection: close'); 
header('Content-Length: '.ob_get_length()); 
flush(); 
ob_end_flush(); 

Đây là một giải pháp khi một người tải một trang web bình thường. Khi một người đang sử dụng AJAX GET qua Microsoft.XMLHTTP phản đối nó là đủ để gửi "Kết nối: đóng" tiêu đề với các yêu cầu GET, như

r.request.open("GET", url, true); 
r.request.setRequestHeader("Connection", "close"); 
r.request.send(); 
0

Tất cả những bài viết - Vô hiệu hoá đọc PDF .. và các công cụ mà ... sẽ không giải quyết được vấn đề của bạn ... Nhưng chắc chắn shot - chạy Windows Update .. giữ uptodate .. vấn đề này được giải quyết bằng cách riêng của mình .. Kinh nghiệm nói;)

HydTechie

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