0

OK、私はこれを理解するために Fiddler をさらに掘り下げてきました.. IIS 8 サイトと IIS7 サイトに行くと、2 つの要求が送受信されていることがわかりました。私はまったく同じクライアントを使用してテストを行い、サーバーアドレスのみを変更しました..したがって、サーバーアドレスを除いてすべてが同じです。

質問: IIS8 に対して 2 つの要求が表示されるのはなぜですか? また、これを停止するにはどうすればよいですか?

IIS 7 サイトに送信すると、次のように表示されますが、パケットは 1 つだけです。 オプション /SERVER/api/messagetypeopt/97 HTTP/1.1 ホスト: (.net 4 - IIS7 サーバー) 接続: キープアライブ Access-Control-Request-Method: PUT 発信元: null ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1 ; WOW64) AppleWebKit/535.11 (Gecko のような KHTML) Chrome/17.0.963.33 Safari/535.11 Access-Control-Request-Headers: accept, origin, content-type Accept: / Accept-Encoding: gzip,deflate,sdch Accept-Language : en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 キャッシュ制御: no-cache

HTTP/1.1 200 OK サーバー: Microsoft-IIS/7.0 X-Powered-By: ASP.NET 日付: 2013 年 5 月 20 日月曜日 13:31:04 GMT 接続: 閉じる Content-Length: 0

しかし、IIS 8 サイトにアクセスすると、パケットが表示されます。ただし、Ajax リクエストは 1 つだけです。Packet 1 OPTIONS /server/api/messagetypeopt/115 HTTP/1.1 Host: .NET 4.5 IIS 8 server Connection: keep-alive Access-Control-Request-Method: PUT Origin: null User-Agent: Mozilla/5.0 (Windows NT 6.1 ; WOW64) AppleWebKit/535.11 (Gecko のような KHTML) Chrome/17.0.963.33 Safari/535.11 Access-Control-Request-Headers: accept, origin, content-type Accept: / Accept-Encoding: gzip,deflate,sdch Accept-Language : en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 キャッシュ制御: no-cache

HTTP/1.1 200 OK サーバー: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Access-Control-Allow-Headers: Content-Type、Accept、X-Requested-With、x-csrftoken Access-Control-Allow-メソッド: GET、POST、OPTIONS、PUT Access-Control-Allow-Origin: * Date: Mon, 20 May 2013 13:26:30 GMT Connection: close Content-Length: 0

パケット 1 の直後にパケット 2 PUT /server/api/messagetypeopt/115 HTTP/1.1 Host: .NET 4.5 IIS 8 server Connection: keep-alive Content-Length: 84 Accept: / Origin: null User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (Gecko のような KHTML) Chrome/17.0.963.33 Safari/535.11 Content-Type: application/json;charset=UTF-8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 キャッシュ制御: no-cache

HTTP/1.1 405 Method Not Allowed キャッシュ制御: プライベート 許可: GET、HEAD、OPTIONS、TRACE コンテンツ タイプ: text/html; charset=utf-8 サーバー: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Access-Control-Allow-Headers: Content-Type、Accept、X-Requested-With、x-csrftoken Access-Control-Allow-メソッド: GET、POST、OPTIONS、PUT Access-Control-Allow-Origin: * Date: Mon, 20 May 2013 13:26:30 GMT Connection: close Content-Length: 5332

完全を期すために、呼び出しを行うJavaScriptコードを追加しました..これは、別のドメインからサーバーに行われます(実際にはローカルPCから)

var mesType = {
            MessageTypeID: mID,
            typeName: mType,
            OptIns:isChecked,
            SenderID: SENDER_ID,
            BranchID: CURRENT_BRANCH
        };

        try {
            JSON.stringify(mesType);
        }
        catch (ext) {
            alert("error on creating json object");
        }
// PUT THIS BACK IN!! to get optIns
        $.support.cors = true;
        $.mobile.allowCrossDomainPages = true;
        $.mobile.loading('show');
        $.ajax({
            url:  MYSERVERNAME + 'api/messagetypeopt/' + mID,
            type: 'PUT',
            data: JSON.stringify(mesType),
            contentType: "application/json;charset=utf-8",
            jsonp: 'callback',
            crossDomain: true,
            success: function (data) {
                // WriteResponse(data);
                //alert('updated database for :' + mType + '=' + data);
            },
            error: function (x, y, z) {
                if (inApp == 1)
                {
                alert('THere was an error updating the server' + x + '\n' + y + '\n' + z);
                }
            },
            complete: function (a, b) {
                //alert('complete:' + a + '\n' + b);
               $.mobile.loading('hide');
            }
        });
4

1 に答える 1

0

ブラウザーが GET、HEAD、または POST 以外のメソッドでクロス ドメイン リクエストを行うように求められると、ブラウザーは最初に問題のメソッドの Access-Control-Request-Method ヘッダーを含む OPTIONS リクエストを送信します。あなたのケースでは PUT のメソッドを使用したリクエストは、サーバーが目的のメソッドを含む Access-Control-Allow-Methods ヘッダーで応答した場合にのみ行われます。GET、HEAD、または POST 以外のリクエストは、「プリフライト」リクエストと呼ばれます。Mozilla には、CORS の内部に関するかなり詳細な記事と、プリフライトされたリクエストに関するより詳細な記事があります。

あなたの質問に答えるために、あなたが投稿した内容に基づいて、IIS7 は Cross-Origin Resource Sharing を正しく処理するように設定されていないように見えるため、ブラウザーが要求を続行するための適切なヘッダーで応答しません。IIS8 は CORS を処理するように構成されているようで、Access-Control-Allow-Methods で応答するため、ブラウザーは実際の PUT 要求を続行できます。CORS 要求を処理しないように IIS8 構成を変更すると、2 番目の要求が停止するはずです。これはおそらく、アプリケーションの web.config ファイルで定義されている、"Access-Control-Allow" で始まるすべてのカスタム ヘッダーを削除することで実現できます。リクエストを 1 つだけにして、実際にサーバーに到達するために PUT リクエストが必要な場合は、CORS を完全に回避するために、同じドメインからリクエストを行うページを提供することをお勧めします。

于 2013-08-14T18:47:24.457 に答える