15

mydomain.comRESTful バックボーン アプリケーションから、 からへの CORS リクエストを実行していmyExtdomain.comます。

サーバーにCORSを設定しまし。動詞(任意のURL)に次のようmyExtdomain.comに応答しています:OPTIONS

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers: Content-Type

Status Code: HTTP/1.1 204 No Content

そして、私のAPI呼び出しにmyExtdomain.com

Access-Control-Allow-Origin: *
Content-Type: application/json

Status Code: HTTP/1.1 200 OK

私は必死になって、すべての HTTP リクエストに応答しようとしmyExtdomain.comました。

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers: Content-Type
Content-Type: application/json

Status Code: HTTP/1.1 200 OK

問題

  • Chromeではすべて正常に動作します
  • Firefox では、PUTリクエストは機能しますが、GETリクエストは「ちょっと失敗」します...

「ちょっと失敗」の定義

  • 返される HTTP ステータス コードは次のとおりです。200 OK
  • しかし、応答は空です (応答本文なし/サイズ 0 KB) JSON
  • しかし、なぜか100回に1回、1回のGETリクエストでうまくいく

退屈な詳細別名「ヘッダー」

OPTIONS動詞への応答:

REQUEST HEADERS
-----------------
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0
Origin: http://mydomain.com
Host:   www.myExtdomain.com
Connection: keep-alive
Access-Control-Request-Method:  PUT
Access-Control-Request-Headers: content-type
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

RESPONSE HEADERS
-----------------
X-Powered-By:   ASP.NET
Server: Microsoft-IIS/7.0
Date:   Fri, 15 Nov 2013 07:01:57 GMT
Content-Type:   text/html
Access-Control-Allow-Origin:    *
Access-Control-Allow-Methods:   POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Headers:   Content-Type

PUTリクエスト:

REQUEST HEADERS
----------------
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0
Referer:    http://mydomain.com/account
Origin: http://mydomain.com
Host:   www.myExtdomain.com
Content-Type:   application/json; charset=UTF-8
Content-Length: 36
Connection: keep-alive
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: application/json, text/javascript, */*; q=0.01

RESPONSE HEADERS
----------------
X-Powered-By:   ASP.NET
Server: Microsoft-IIS/7.0
Date:   Fri, 15 Nov 2013 07:01:57 GMT
Content-Type:   application/json
Content-Length: 0
Access-Control-Allow-Origin:    *

BODY RESPONSE
--------------
_Some_Json_Here_

魔法GETリクエスト:

REQUEST HEADERS
----------------
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0
Referer:    http://mydomain.com/somepage
Origin: http://mydomain.com
Host:   www.myExtdomain.com
Connection: keep-alive
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: application/json, text/javascript, */*; q=0.01

RESPONSE HEADERS
----------------
Server: Microsoft-IIS/7.0
Last-Modified:  Fri, 15 Nov 2013 06:58:18 GMT
Date:   Fri, 15 Nov 2013 07:01:57 GMT
Content-Type:   application/json
Content-Length: 4041
Connection: keep-alive

RESPONSE BODY
--------------
Empty (0KB), it's supposed to be some JSON, that *SOMETIMES* (1/100) I get.. Magic.

最後に

  • ご覧のとおり、マジックGETリクエストのレスポンス ヘッダーには、私が設定した CORS ヘッダーさえ含まれていません。myExtdomain.com
  • 一方PUT、リクエストにはそれらが含まれています..
  • 繰り返しますが、Chrome ではすべてが正常に機能し、すべての応答ヘッダーが存在し、JSON期待どおりに取得されます。
  • 私はCORSの研究 にかなりの時間を費やしました(明らかに十分ではありませんでした)、必要なもの/不要なものを分解し、ランダムなコードをコピー/貼り付けしない
  • JSONPGETリクエストはにとって代替手段ではありません
  • すべてのリクエスト (任意の動詞) は、安全でないページから作成されています (からではありませんhttps://)
  • 私は絶望的です..
4

2 に答える 2

17

Cache-Control: no-cacheすべての API 呼び出し Responses (on ) にヘッダーを追加するとmyExtdomain.com、問題が解決しました。

Access-Control-Allow-Origin: *
Content-Type: application/json
Cache-Control: no-cache

何らかの理由で、Firefox は API 呼び出しをキャッシュしていましたが、キャッシュすると、FF は JSON を再度解析できませんでした.空の応答本文または何らかのエラーで終了しました..

no-cache今思い出すと、Firefoxを強制的に使用するのはこれが初めてではありません。

繰り返しますが、Chrome ではすべてが正常に機能していました。Chrome にはCache-Control: no-cacheヘッダーは必要ありません。

誰かが FF と Chrome のこの違い (デフォルト設定??) について知っていれば、それ以上は知りません。

これが誰かの時間を節約することを願っています。

于 2013-11-16T18:51:27.887 に答える