2011-01-19 29 views
8

Tôi đang cố gắng thực hiện cuộc gọi không đồng bộ đến dịch vụ trả về json bằng XDomainRequest (IE8). Vấn đề là tôi luôn luôn nhận được một lỗi (sự kiện onerror được bắn, và responseText là luôn luôn null), tôi đang sử dụng fiddler để kiểm tra phản ứng của dịch vụ và tôi có vẻ đúng (tôi có thể nhìn thấy đối tượng json returnig), điều này chỉ xảy ra trong IE8 khi sử dụng XDomainRequest, cùng một chức năng được thực hiện trong JQuery hoạt động tốt.Vấn đề XDomainRequest

Mọi đầu mối sẽ được đánh giá cao. Cảm ơn!

P.S .: Điều này là mã javascript của tôi:

..... 
    if (jQuery.browser.msie && window.XDomainRequest) { 
    //Use Microsoft XDR 
    var xdr = new XDomainRequest(); 
    xdr.open("post", url); 
    xdr.onload = function() { 
     alert("Loading"); 
     alert(xdr.responseText); 
    }; 
    xdr.onsuccess = function() { 
     alert("Success!"); 
     alert(xdr.responseText); 
    }; 
    xdr.onerror = function() { 
     alert("Error!"); 
     alert(xdr.responseText); 
    }; 
    xdr.onprogress = function() { 
     alert("Progress"); 
     alert(xdr.responseText); 
    }; 
    xdr.timeout = 1000; 
    xdr.send("data: " + escape(data)); 
    var response = xdr.responseText; 
} else ..... 

Trả lời

8

Bạn có chắc chắn rằng dịch vụ là gửi một Access-Control-Allow-Origin -header phù hợp với URL yêu cầu?

+0

cảm ơn! Tôi quên thêm tiêu đề này. – GiaNU

+0

cảm ơn! Tôi đặt ** Access-Allow-Control-Origin ** do nhầm lẫn – Sam

+0

vui lòng giải thích. – Amit

4

Một bài cũ năm ,, bạn vẫn có GiaNU ?! Bạn đang gọi xdr.onsuccess nhưng tôi không nghĩ rằng phương thức đó tồn tại. Các xdr.onload hoạt động và dường như tương đương với chức năng "thành công" AJAX của jQuery.

thứ X-Domain này còn khá mới mẻ nhưng có một mô hình rất đẹp làm việc có sẵn từ MS tại đây: AJAX - Introducing Cross-domain Request (XDR)

Các xdr.ontimeout tôi không thể có được để làm một chuyện, nhưng không tìm thấy một nhu cầu chưa :) Tôi đã có những thứ và chạy đầu tiên w/jQuery và bây giờ với ie9 cảm ơn đến bài MS.

Các XDR có một số rắc rối với thời gian cho các ứng dụng hiện tại của tôi và chỉ được sử dụng một thời gian chờ để xử lý nó:

xdr.onload = setTimeout(function(){ doIt(xdr.responseText), 2000}); 
+0

Tôi vẫn ở đây, tất nhiên;). Cảm ơn câu trả lời của bạn! – GiaNU

+0

Cảm ơn, đây chính xác là giải pháp tôi cần! – markyd13

+0

setTimeout sẽ không hữu ích. Vấn đề thực tế là IE8 có thể thu gom rác thải XDomainRequest trong khi nó có yêu cầu đang chờ xử lý đang mở. Nếu bạn nhìn vào cuộc gọi setTimeout của mình, bạn đang nắm bắt biến XDR tránh bộ thu gom rác lâu hơn một chút - chỉ cần di chuyển vấn đề. Tôi đã đăng câu trả lời chi tiết với các giải pháp ở đây: http: // stackoverflow.com/questions/8058446/ie-xdomainrequest-not-always-work – ShadowChaser

1

Gotcha khác là nếu bạn đang chạy dịch vụ qua Cassini sau đó là "Access- Tiêu đề Control-Allow-Origin "sẽ không được trả lại vì Cassini không nhận ra điều này. Chúng tôi đã có một tình huống mà các cuộc gọi dịch vụ của chúng tôi đang hoạt động trên máy chủ thử nghiệm nhưng không hoạt động cục bộ. Hóa ra dịch vụ được lưu trữ trong Cassini trên máy dev cục bộ của chúng ta nhưng được lưu trữ trên IIS trên máy chủ thử nghiệm.

Ngoài ra đây là web.config thiết cho bất cứ ai cần nó (lưu ý: điều này cho phép truy cập từ bất kỳ miền - "*"):

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer>