0

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 を削除する必要がありました。

4

2 に答える 2

1

web.config ファイルを Web アプリケーションのサブディレクトリに配置する場合は、そのサブディレクトリを IIS マネージャーのアプリケーションに変換する必要があります。そうしないと、このサブディレクトリへのリクエストごとにエラー 500 が返されます。

誰かが 1 つのサーバーで Web アプリケーションに変換しましたが、他のサーバーでは変換しませんでした。そのため、一部のユーザーはデータを取得し、データの代わりにエラー 500 を取得しました。

于 2013-05-09T09:57:24.780 に答える