Почему этот междоменный запрос работает в других браузерах, но не в IE9? - PullRequest
6 голосов
/ 22 июня 2011

У меня есть некоторый Ajax-код, который работает в Safari, Chrome и Firefox, но не в IE9.

Страница находится на http://foo.com/test.aspx, и она отправляет запрос AJAX веб-службе, размещенной на https://service.foo.com.Я думал, что у меня не будет каких-либо междоменных проблем, но, учитывая, что IE9 блокирует его, похоже, что я делаю: (

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

Как я уже говорил, код работает в других 3 браузерах, но только неIE9. (Меня интересует только IE9, а не IE8 или старше).

Я немного покопался и нашел эту статью на MSDN, которая гласит:

Для междоменных запросов требуется взаимное согласие между веб-страницей и сервером. Вы можете инициировать междоменный запрос на своей веб-странице, создав объект XDomainRequest вне оконного объекта и открыв соединение с конкретным доменом. Браузер запроситданные с сервера домена, отправив заголовок Origin со значением источника. Соединение будет завершено, только если сервер ответит заголовком Access-Control-Allow-Origin либо *, либо точным URL-адресом запрашивающей страницы.Поведение является частью проекта структуры рабочей группы по веб-приложениям Консорциума Всемирной паутины (W3C) по перекрестному домену на стороне клиента.В сообщении, с которым интегрируется объект XDomainRequest.

Прежде чем идти по пути использования XDR, я хотел бы проверить с людьми, умнее меня, правильный ли это подход или нет.

  1. Добавить Response.AddHeader("Access-Control-Allow-Origin", "*"); на мою страницу
  2. Создать код условия jscript, который обнаруживает IE9 и использует XDR вместо обычного вызова jquery, который я использую с $.get.

Я полностью выключен или это правильный путь?

(Предполагая, что это правильный путь, куда идет заголовок ответа Acecss-Control-Allow-Origin -на моей странице в http://foo.com/test.aspx или на веб-сервисе в https://service.foo.com?)

Ответы [ 3 ]

10 голосов
/ 04 апреля 2012

Вместо $.ajax() используйте этот пользовательский код:

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();
}

Примечание: это работает для запросов GET.

Чтобы адаптировать его к запросам POST, измените следующие строки:

function newpostReq(url,callBack,data)

data - это параметры URL-адресов для запросов на отправку, такие как: key1 = value1 & key2 = value% 20two

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

Чтобы подвести итог, откройте соединение как POST-запрос (строка 1),установите заголовок запроса для urlencoded типа данных поста (оберните его try-catch для исключительных браузеров) (строка 2), затем отправьте данные (строка 3).

1 голос
/ 28 июня 2011

Я просто боролся с той же проблемой.

PHP-сервер, MIME и да,

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

работал почти * во всех браузерах - кроме IE9.

похоже, что jQuery.getJSON не выполняет XDR автоматически для ie9 - после создания прокси-сервера службы в том же домене это сработало.

* почти - опера действует тоже.

edit: хорошо, опера имела ту же проблему, что и ie9. теперь работает как шарм.

примечание: chrome, safari и firefoxes (3.6-5) не имели проблем с междоменными запросами с ACAO: *.

что я не понимаю, так это то, почему а) Microsoft использует другой объект для междоменных запросов и б) почему jquery не переключается прозрачно (или, по крайней мере, предоставляет возможность выбора).

0 голосов
/ 22 июня 2011

Если это работает в других браузерах (которые поддерживают CORS), то ваш SVC, кажется, уже поддерживает это, но, чтобы быть уверенным, используйте Fiddler2, чтобы увидеть, что происходит.

Заголовок Access-Control-Allow-Origin используется на запрашиваемом ресурсе, а не на странице, запрашивающей его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...