3

ajaxを使用してWCFRESTベースのサービスを呼び出しています。

ajaxメソッドは、ページが読み込まれる前に呼び出されます。ajaxリクエストのヘッダーで「トークン」を送信したいと思います。フィドラーでは、これは私が見るものです:

1.)ヘッダーにトークンが含まれていないサービスへのリクエスト(AJAX呼び出しの失敗)2。)ヘッダーにトークンが含まれている同じサービスへのリクエスト(AJAX呼び出しが渡されました)

その後、すべてがクロムとサファリで正常に動作します。ただし、IE10とMozillaでのサービス呼び出しは1つだけです。その結果、リクエストのヘッダーにトークンがないため、IE10とMozillaではサービス呼び出しが失敗します。

これは私が呼び出すメソッドです:

function callservice (method, serviceUrl, params, successHandler, errorHandler) {
    $.ajax({
        crossDomain: true,
        type: method,
        url: serviceUrl,
        beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Authorization", Token); },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: successHandler,
        error: errorHandler
    });
    function photos(data) {
        alert(data);
        console.log(data);
    };
}

私はWebサービスとアプリケーション(このWebサービスと呼ばれる)の両方を制御します。この問題は、アプリケーションとWebサービスの両方がローカルホストでホストされている場合には発生しません。その場合、成功したサービス呼び出しは1つだけです。ただし、クロスドメイン呼び出しがある場合は、2つのAJAX呼び出しがあります。

私の質問は、AJAXリクエストが最初の試行でトークンを送信しないのはなぜですか?そして、なぜトークンは2番目のAJAX呼び出しでのみ送信されるのですか?

どんな種類の助けも大歓迎です。

4

3 に答える 3

7

問題はCORSにありました。以前は、ブラウザはセキュリティの脅威と見なされていたため、クライアントのドメインとは異なるドメインに対してajaxリクエストを行うことを許可していませんでした。最新のブラウザは、サーバーがあればクロスドメインのajaxリクエストを作成できます。クライアントと連携します。したがって、ブラウザからクロスドメインリクエストがあった場合に実際に発生するのは次のとおりです。

1.)最初に、ブラウザーは「Preflight」要求をサービスに送信して、WCFサービスから承認情報(私の場合は「OPTIONS」としてヘッダーメソッドを使用した要求)を収集します。代わりに、Webサービスは応答ヘッダーの一部としてAccess Control Allow Originを送信します。この要求の結果としてフィドラーに表示されるエラーは、HTTP 500エラーでした。このAJAX要求は、データフィールドに何もありません。 WCFサービスの承認の詳細を見つける方法。

2.)ChromeとSafariは、サービスの認証の詳細がわかったので、Webサービスに2回目のリクエストを行いました。一方、FirefoxとIEは、HTTP 500エラーが発生したため、サービスに2回目のajaxリクエストを行うことを好みませんでした。飛行前のリクエスト。したがって、ChromeとSafariの両方がサービスと通信できました。

したがって、解決策は、「Preflightリクエスト」が行われた場合にWCFサービスからの応答を変更することでした。HTTP200OK応答を送信する「Preflightリクエスト」がある場合にサービスによって送信される応答を変更しました。これにより、IEやMozillaなどのブラウザは、プリフライトリクエストの後に実際のリクエストを送信できるようになりました。

これが私が参照したソースの1つです:http: //www.bennadel.com/blog/2327-Cross-Origin-Resource-Sharing-CORS-AJAX-Requests-Between-jQuery-And-Node-js.htm

これが同じ問題に直面している人々に役立つことを願っています。

于 2012-12-28T15:09:47.827 に答える
0

クロスドメインコールは、同一生成元ポリシーの下にあります。デフォルトでは電話をかけることはできません。CORS、JSONP、またはプロキシを使用する必要があります。

于 2012-11-28T21:51:25.450 に答える
-1

XMLHttpRequest:変更されていない限り、MS ExplorerではActiveXObject( "Microsoft.XMLHTTP")を使用する必要があります。プレーンJSで行われた私のajax呼び出しでは、次の行を使用して、ブラウザーに応じてオブジェクトを作成します。

if (window.XMLHttpRequest){
   //for most BRowsers
   r = new XMLHttpRequest(); 
} else{ 
   //for Explorer
   r = new ActiveXObject("Microsoft.XMLHTTP");
}

次に、私の場合、ここ(r)で作成されたオブジェクトにbeforesendを適用します。これがEIの問題だと私は本当に信じています。しかし、テストされていません。

于 2012-11-28T21:42:01.220 に答える