2011-06-22 31 views
6

Tôi có một số mã Ajax đang hoạt động trong Safari, Chrome và Firefox nhưng không hoạt động trong IE9.Tại sao yêu cầu miền chéo này hoạt động trong các trình duyệt khác chứ không phải IE9?

Trang này nằm trên http://foo.com/test.aspx và đang thực hiện yêu cầu AJAX cho dịch vụ web được lưu trữ trên https://service.foo.com. Tôi nghĩ rằng tôi sẽ không có bất kỳ vấn đề tên miền chéo nào nhưng IE9 đang chặn nó, có vẻ như tôi làm: (

var tempUrl = "https://service.foo.com/dummy.svc/test?hi=bye"; 
$.get(tempUrl, "html"); 

Như tôi đã đề cập, mã hoạt động trong 3 trình duyệt khác, không phải IE9. . (tôi chỉ quan tâm đến IE9, không IE8 trở lên)

tôi đã làm một số đào và tìm thấy this article trên MSDN nói rằng:

yêu cầu Cross-miền đòi hỏi lẫn nhau sự đồng ý giữa các trang Web và máy chủ . Bạn có thể bắt đầu yêu cầu tên miền chéo trong trang Web của bạn bằng cách tạo đối tượng XDomainRequest ngoài đối tượng cửa sổ và mở kết nối vào một miền cụ thể. Trình duyệt sẽ yêu cầu dữ liệu từ máy chủ của tên miền bằng cách gửi một tiêu đề Xuất xứ với giá trị xuất xứ. Nó sẽ chỉ hoàn tất kết nối nếu máy chủ phản hồi với tiêu đề Access-Control-Allow-Origin của hoặc * hoặc URL chính xác của trang yêu cầu . Hành vi này là một phần của World Wide Web Consortium (W3C) 's ứng dụng web làm việc khuôn khổ dự thảo của nhóm trên phía máy khách thông tin liên lạc tên miền chéo rằng đối tượng XD2R1601 XDomainRequest tích hợp với.

Trước khi tôi đi xuống đường dẫn sử dụng XDR Tôi muốn xác minh với những người thông minh hơn tôi xem đây có phải là phương pháp phù hợp hay không.

  1. Thêm Response.AddHeader("Access-Control-Allow-Origin", "*"); đến trang của tôi
  2. Tạo mã JScript điều kiện phát hiện IE9 và sử dụng XDR thay vì các cuộc gọi jquery thường xuyên Tôi đang sử dụng với $.get.

Tôi có hoàn toàn tắt hoặc đây có phải là cách phù hợp để thực hiện việc này không?

(Giả sử đó là cách đúng đắn để đi, nơi nào các Acecss-Control-Allow-Origin phản ứng tiêu đề đi - trên trang của mình tại http://foo.com/test.aspx hoặc trên webservice tại https://service.foo.com?)

+0

Nói chung, JQuery nhận thức được các hạn chế về cùng một nguồn gốc của trình duyệt và không nên cố gắng sử dụng CORS trong các trình duyệt không hỗ trợ nó. Bạn có thấy lỗi tập lệnh trong bảng điều khiển Công cụ dành cho nhà phát triển F12 của IE9 không? – EricLaw

+0

Eric, không có lỗi nào được ném trong bảng điều khiển công cụ dành cho nhà phát triển. – TMC

Trả lời

0

Nếu đây hoạt động trong các trình duyệt khác (có hỗ trợ CORS), sau đó SVC của bạn dường như đã hỗ trợ điều này, nhưng để chắc chắn, hãy sử dụng Fiddler2 để xem điều gì đang diễn ra.

Tiêu đề Access-Control-Allow-Origin được sử dụng trên tài nguyên được yêu cầu, không phải trên trang yêu cầu.

1

tôi vừa vật lộn với cùng một vấn đề.

php backend, kịch câm ngay và có,

header('Access-Control-Allow-Origin: *'); 

làm việc trong hầu hết mọi trình duyệt * - ngoại trừ IE9.

có vẻ như jQuery.getJSON không tự động làm XDR cho ie9 - sau khi tạo proxy dịch vụ trên cùng một tên miền, nó hoạt động.

* gần như - opera cũng hoạt động.

chỉnh sửa: được rồi, opera có cùng vấn đề với ie9. Làm việc giống như một nét duyên dáng bây giờ.

lưu ý: chrome, safari và firefox (3.6-5) không có vấn đề với yêu cầu miền chéo với ACAO: *.

những gì tôi không hiểu là lý do tại sao a) microsoft sử dụng đối tượng khác cho yêu cầu miền chéo và b) tại sao jquery không chuyển đổi rõ ràng (hoặc ít nhất cung cấp tùy chọn để chọn).

10

Thay vì $.ajax(), sử dụng mã tùy chỉnh này:

function newpostReq(url,callBack) 
{ 
    var xmlhttp; 
    if (window.XDomainRequest) 
    { 
     xmlhttp=new XDomainRequest(); 
     xmlhttp.onload = function(){callBack(xmlhttp.responseText)}; 
    } 
    else if (window.XMLHttpRequest) 
     xmlhttp=new XMLHttpRequest(); 
    else 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
      callBack(xmlhttp.responseText); 
    } 
    xmlhttp.open("GET",url,true); 
    xmlhttp.send(); 
} 

Lưu ý: Công việc này cho các yêu cầu GET.

Để thích nghi với nó trên yêu cầu POST thay đổi những dòng sau:

function newpostReq(url,callBack,data) 

dữ liệu là các thông số URL được mã hóa của các bài yêu cầu như: key1 = value1 & khóa2 = giá trị% 20two

xmlhttp.open("POST",url,true); 
    try{xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");}catch(e){} 
    xmlhttp.send(data); 

Để tóm tắt, hãy mở kết nối theo yêu cầu POST (Dòng 1), đặt tiêu đề yêu cầu cho loại dữ liệu bài đăng được mã hóa (bọc nó bằng try-catch cho các trình duyệt ngoại lệ) (Dòng 2), sau đó gửi dữ liệu (Dòng 3) .

+1

Điều này hoạt động hoàn hảo, cảm ơn. –

+1

Có nó hoạt động hoàn hảo với yêu cầu GET, nhưng tôi nên làm gì cho yêu cầu POST trong IE8 và IE9 – Surya

+0

Nếu tôi muốn thực hiện yêu cầu POST, tôi đang sử dụng CORS trong dịch vụ của mình và cần gửi dữ liệu JSON bằng Yêu cầu POST trong IE8 và IE9 – Surya

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