Microsoft IIS サーバーを (TMG ファイアウォール経由で) 取得しました。Apacheサーバーを入手しました(別の場所、ファイアウォールなし)。私のIISサーバーはデータファイル(プレーンテキスト、実際にはCSV)を提供しています。
Apache サーバーは、jQuery.ajax()
メソッドを介して IIS サーバーからデータをロードする単純な HTML ページを提供します。または、XDomainRequest()
IE8 およびおそらく 9 で ($.ajax
トランスポートとして作成)。
データを含むディレクトリの web.config は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<location path=".">
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,POST" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
</system.webServer>
</location>
</configuration>
テストは次のとおりです。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CORS TEST</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$(function () {
var h2 = $('h2:first');
h3 = $('h3:first');
h3.text(navigator.userAgent);
$.ajax({
url : '//my.iis.site.net/ajax/data/test.csv',
method : 'GET'
})
.done(function() {
h2.text('WORKS.');
})
.fail(function() {
h2.text('FAILED.');
});
});
</script>
</head>
<body>
<h1>CORS TEST:</h1>
<h2></h2>
<h3></h3>
</body>
</html>
CORS をサポートする指定されたすべてのブラウザーでテストしました。そして、さらにいくつかのモバイルのもの。私はそれを失敗させることができませんでした。それはすべて本によって機能します。
職場のチームでこの構成をテストした後、新しいサイトをより多くのユーザーに配信しても問題ないことがわかりました。そして、それはすべての地獄が解き放たれたときです。
ほとんどの人は効果があると言っています。しかし、かなりの数 (間違いなく 10% 以上) の人々は、それが機能しないと言っています. 残念ながら、それは 10% をはるかに超えており、50% になる可能性もあります。
最悪のケースは次のとおりです。2 人で、ほぼ (または完全に) 同じソフトウェア (OS、構成、プログラム、ISP、ブラウザ) を使用します。1 人は AJAX データを認識し、もう 1 人は認識しません。
同じ OS、同じブラウザー (両方のコンピューターで 3 つの異なるブラウザー、まったく同じバージョン、同じ ISP でテスト済み)。
一部のコンピューターでは、何があっても CORS が機能しません。
そして、はい、すべてのブラウザ キャッシュをクリアしました。役に立ちませんでした。
ブラウザはコンソールにエラーをスローせず、$.ajax()
メソッドはメソッドをトリガーするだけ.fail()
です.done()
. 私のマシンでは常に動作するため、テスト方法がわかりません。私のすべてのモバイル デバイスと GSM ネットワークでも、魅力的に機能します。かなり古いAndroidバージョンとかなり古いデフォルトブラウザでも. 一部の人々がコンピューターやモバイルデバイスで動作させることができないのと同じように、私がそれを失敗させることはできません.
それはどんな邪悪な魔法ですか?CORS のことは忘れて、JSONP トランスポートに切り替える必要がありますか?
JSONP を使用しないのには理由があります。データ サーバーは大量のトラフィックを受信します。データは 500 ミリ秒ごとに更新され、何千ものユーザーによって非常に頻繁に (500 ミリ秒の速度でも) リロードされます。IIS サーバーで要求ごとにスクリプトを実行することは、最善の方法ではありません。パフォーマンスにかなりの悪影響を与える可能性があります。
手がかりはありますか?データを PNG として圧縮し、JS 経由で解凍しますか? :) それはクレイジーなハックです。CORS はクレイジーではありませんが、これは私が得たものです。
どうすればテストを開始できますか?jQueryのバグかもしれませんが、私はそれを疑っています。CORS 経由でファイルにアクセスできない人は、リクエスト スクリプトが同じドメインから実行された場合でも、ファイルにアクセスできません。AJAX を同じドメインで動作させるには、web.config を削除する必要がありました。