2013-03-15 3 views
2

У меня проблема с приложением, которое связывается с Ajax, чтобы потреблять некоторые успокоительные услуги с другого сервера.CORS с IE, XMLHttpRequest и ssl (https)

Проблемные швы, которые появляются только с IE, и когда потребляющее приложение находится на сервере с ssl, я имею в виду, когда я использую одни и те же услуги с одного и того же сервера из другого окна, все работает нормально.

Я на успокоительных услуги на сервере (https://api.restbla/..), которые имеют SSL и Я потреблять их от других серверов (с или без сертификата SSL)

Тестирование с помощью Internet Explorer, я получаю результаты:

  • Если я потребляю услуги от моих местных работ
  • Если я потребляю услуги из тех же коробков (где успокоительные являются размещенными) работает
  • Если я использую услуги с другого сервера с работами ssl
  • Но когда я использую службы с сервера на https, не работайте над IE.

Все предварительная тестовой работы с Chrome и FF

Это Javascript, что им с помощью, чтобы сделать Аякс позвонить

function load(_url, _callback, _params, _type, _htmlMethod, _onStartFunction, _onFinishFunction) { 
    var xhr; 
    if (isFunction(_onStartFunction)) { _onStartFunction(); } 
    ieVersion = getInternetExplorerVersion(); 
    if (typeof XMLHttpRequest !== 'undefined') { 
     console.log("XMLHttpRequest"); 
     xhr = new XMLHttpRequest(); 
    }else { 
     if (ieVersion > 7){ 
      console.log("XDomainRequest"); 
      xhr = new XDomainRequest(); 
     }else{ 
      var versions = [ "MSXML2.XmlHttp.5.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.2.0", "Microsoft.XmlHttp" ]; 
      for (var i = 0, len = versions.length; i < len; i++) { 
       try { 
        console.log("ActiveXObject: " + versions[i]); 
        xhr = new ActiveXObject(versions[i]); 
        break; 
       } catch (e) { /* attempt next one*/ } 
      } 
     } 
    } 
    xhr.onreadystatechange = ensureReadiness; 
    if (_type == JSON_TYPE) { 
     contentType = "application/json"; 
    }else{ 
     contentType = 'text/plain'; 
    } 

    function ensureReadiness() { 
     if (xhr.readyState < 4) { return; } 
     if (xhr.status !== 200) { 
      showServiceDown(); 
      if (isFunction(_onFinishFunction)) { _onFinishFunction();} 
      return; 
     } 
     if (xhr.readyState === 4) { 
      if (isFunction(_onFinishFunction)) {_onFinishFunction(); } 
      var responseText = ""; 
      responseText = xhr.responseText; 
      if (_type == JSON_TYPE) { 
       _callback(responseText); 
      } else if (_type = HTML_TYPE) { 
       var replaced = responseText.replace(/\\/g, '///'); 
       _callback(replaced); 
      } else { _callback(responseText); } 
     } 
    } 
    if ((_htmlMethod == undefined) || (_htmlMethod == null) || (_htmlMethod == "")) { 
     _htmlMethod = METHOD_POST; 
    } 
    xhr.open(_htmlMethod, _url, true); 
    xhr.withCredentials = true; 
    xhr.setRequestHeader("Content-type", contentType); 
    _params = (_params != undefined) ? _params : null; 
    xhr.send(_params); 
} 

Я не могу использовать любого яваскрипт рамки для этого проекта ,

сертификаты являются меридиональными для компании только для внутреннего использования, поэтому любая ошибка проверки браузера терпит неудачу, я не знаю, связано ли это с проблемой.

Надеюсь, у кого-нибудь есть решение этой проблемы.

большое спасибо за ваше время.

ответ

1

У меня была аналогичная проблема, которая была решена путем добавления фиктивного onprogress обратного вызова к XDomainRequest в случае IE:

if (ieVersion > 7){ 
    console.log("XDomainRequest"); 
    xhr = new XDomainRequest(); 
    xhr.onprogress = function() {}; // <-- add this 
} 

Это казалось, что IE был прерывании запрос междоменное, если не было onprogess обработчик определен.


Вот функция, я использую для AJAX, может быть, есть что-то в нем, что поможет вам:

/** 
    * Wraps jQuery's AJAX, adds X-Domain support for IE 
    * 
    * 
    */ 
    function xDomainAJAX (url, settings) { 
    jQueryRequired(); 
    $.support.cors = true; // enable x-domain 
    if ($.browser.msie && parseInt($.browser.version, 10) >= 8 && XDomainRequest) { 
     // use ms xdr 
     var xdr = new XDomainRequest(); 
     xdr.open(settings.type, url + '?' + $.param(settings.data)); 
     xdr.onprogress = function() {}; 
     xdr.onload = function() { 
     settings.success(xdr.responseText); 
     }; 
     xdr.onerror = settings.error; 
     xdr.send(); 
    } else { 
     // use jQuery ajax 
     $.ajax(url, settings); 
    } 
    } 
+0

Я пробовал и работал как техника его подводит: S .. Я заметил, что, когда в интернете Свойства проводника-> безопасность-> Параметры безопасности Я выбираю источники доступа к данным по доменам в качестве разрешения, .. он работает на IE .. – cesaregb

+0

@cesaregb Я добавил пример кода, который работал для меня в прошлом – paislee

+0

на самом деле, который работал. используйте XDomainRequest для IE и добавьте onprogress и onload прослушиватели ... черт с IE спасибо большое – cesaregb