Ответ 1
Поддерживается метод POST, и для создания междоменной https://запрос вашей вызывающей страницы также необходимо загрузить через https. Это лучшая статья, которую я нашел, которая подробно объясняет эти и другие ограничения XDomainRequest:
ОБНОВЛЕНИЕ: Я настоятельно рекомендую не вкладывать деньги в XDomainRequest, потому что это очень плохая реализация со многими ограничениями. Он в основном работает только для запросов GET для серверов, отличных от ssl, поэтому вы также можете использовать jsonp или что-то еще.
Я использую CORS для вызова API перекрестного домена, однако Internet Explorer дает проблемы. CORS должен быть возможен в IE8 и IE9 через объект XDomainRequest
, однако я не могу заставить работу работать.
JQuery отказывается, чтобы предоставить встроенную поддержку XDomainRequest, однако нескольким плагинам jQuery предлагается добавить эту поддержку. Эта тема предлагает два таких плагина: jQuery.XDomainRequest.js и xdr.js, о котором сообщалось. Afaik, плагины должны автоматически переопределять поведение jQuery.ajax
. Я нашел еще один плагин здесь.
Я разместил небольшие демо-страницы с соответствующими плагинами jQuery.XDomainRequest и xdr и jquery.ie.cors, которые выполняют запросы ajax на сервере с поддержкой CORS. Страницы работают в Chrome и Firefox, однако IE8/9 мгновенно бросает отклоненную разрешенную ошибку (даже до подачи запроса). Этот сообщение MSDN предлагает добавить другого обработчика xhr.onprogress = function() {};
, но я пробовал это, и он тоже не работает.
Любые подсказки, что я делаю неправильно? Я также тестировал с IE8 теперь с использованием виртуального сервера MS, но он имеет точно такую же проблему.
Изменить: ОК, поэтому я понял, что часть проблемы заключалась в том, что я использовал POST поверх HTTPS. По-видимому, XDomainRequest не разрешает CORS через HTTPS. Я могу переключиться на HTTP, но мне действительно нужен POST.
Edit2: см. эту проблему в github для завершения этой истории. Оказывается, при использовании HTTP POST xDomainRequest может кодировать тело запроса (аргументы) только как text/plain
. Это в значительной степени делает его бесполезным, потому что каждый использует application/x-www-form-urlencoded
или multipart/form-data
.
Поддерживается метод POST, и для создания междоменной https://запрос вашей вызывающей страницы также необходимо загрузить через https. Это лучшая статья, которую я нашел, которая подробно объясняет эти и другие ограничения XDomainRequest:
Я написал прокси-сервер, который будет изящно понижать до проксирования, если используется IE9 или меньше. Вам не нужно менять свой код вообще, если вы используете ASP.NET.
Решение состоит из двух частей. Первый - это jquery script, который перехватывает обработку jQuery ajax. Он будет автоматически вызывать веб-сервер, если будет выполнен запрос crossDomain, а браузер - IE:
$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
if (!window.CorsProxyUrl) {
window.CorsProxyUrl = '/corsproxy/';
}
// only proxy those requests
// that are marked as crossDomain requests.
if (!options.crossDomain) {
return;
}
if (getIeVersion() && getIeVersion() < 10) {
var url = options.url;
options.beforeSend = function (request) {
request.setRequestHeader("X-CorsProxy-Url", url);
};
options.url = window.CorsProxyUrl;
options.crossDomain = false;
}
});
На вашем веб-сервере вы должны получить запрос, получить значение из заголовка X-CorsProxy-Url
http и выполнить HTTP-запрос и, наконец, вернуть результат.
Мое сообщение в блоге: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
Для запросов CORS в IE8/9 вы можете использовать плагин jQuery jquery-transport-xdr