2

別のサーバーからいくつかの安らかなサービスを消費するために Ajax を介して通信しているアプリケーションに問題があります。

問題はIEだけで発生し、消費するアプリケーションがsslを備えたサーバーにある場合、つまり、他のボックスから同じサーバーから同じサービスを消費すると、すべて正常に動作します。

SSLを備えたサーバー( https://api.restbla/.. )にRestfulサービスがあり、他のサーバーからこれらを消費する必要があります(ssl証明書の有無にかかわらず)

Internet Explorer でテストすると、次の結果が得られます。

  • ローカル作品からサービスを利用する場合
  • 同じボックス(残りがホストされている場所)からサービスを消費すると機能します
  • SSLが機能せずに別のサーバーからサービスを利用した場合
  • しかし、https 上のサーバーからサービスを利用すると、IE では機能しません。

以前のテストはすべて、Chrome と FF で動作します

これは、ajax 呼び出しを行うために使用する 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);
}

このプロジェクトには JavaScript フレームワークを使用できません。

証明書は社内でのみ使用されるため、ブラウザの検証メールは失敗します。これが問題と関係があるかどうかはわかりません。

誰かがこの問題の解決策を持っていることを願っています。

お時間をいただきありがとうございます。

4

1 に答える 1

1

onprogressIE の場合、XDomainRequest にダミーのコールバックを追加することで解決された同様の問題がありました。

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

onprogessハンドラが定義されていない場合、IE はクロスドメイン リクエストを中止しているように見えました。


これが私が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);
    }
  }
于 2013-03-15T21:16:31.527 に答える