4

エラーが発生します:

XMLHttpRequest cannot load http://www.scirra.com/handlers/arcadeProcessScore.ashx. Origin http://static1.scirra.net is not allowed by Access-Control-Allow-Origin.

arcadeProcessScore.ashxは次の行を持っています:

public void ProcessRequest (HttpContext context) {

    context.Response.AppendHeader("Access-Control-Allow-Origin", "http://static1.scirra.net");
    context.Response.AppendHeader("Access-Control-Allow-Origin", "https://static1.scirra.net");
    context.Response.ContentType = "text/plain";

それでもエラーは解決しません。

私も簡単に試しました:

context.Response.AppendHeader("Access-Control-Allow-Origin", "*");

どちらも機能しません。

レベルで追加すると機能<add name="Access-Control-Allow-Origin" value="*"/>web.configますが、明らかに解決策ではありません。

arcadeProcessScore.ashxからのリクエストを受け入れるにはどうすればよいstatic1.scirra.netですか? 助けてくれてありがとう。

4

3 に答える 3

5

XmlHttpRequestプロジェクトのハンドラにアクセスするために を直接使用して、独自のテストを行いました。私が使用したセットアップは、ローカル IIS (バージョン 6.1 であるため、7.5 とは動作が異なる可能性があります) でアプリケーションを公開し、Default.aspxページが Visual Studio の開発サーバーで実行されているハンドラーを呼び出すようにすることでした。このような:

http://mymachine/WebTest/Default.aspx

-> XmlHttpRequest get request to

http://localhost:58025/WebTest/TestHandler.ashx

ハンドラーのコード:

public void ProcessRequest (HttpContext context) {
    context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine");
    context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    context.Response.ContentType = "text/plain";
    context.Response.Write("Hello World " + DateTime.Now.ToString());
}

IE9 を使用するとAccess-Control-Allow-Origin、ハンドラーからヘッダーを送り返したかどうかに関係なく、動作は同じでした。IE9 は警告を表示し、コンテンツをロードする必要があるかどうかをユーザーに確認します。

Chrome (バージョン 21.0.1180.79 m) と FF (バージョン 14.0.1) の両方が実際にハンドラーへの要求を生成し、ハンドラーが送り返すヘッダーを尊重します。

したがって、これはChromeとFFで機能しました:

context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine");

これもそうしました:

context.Response.AppendHeader("Access-Control-Allow-Origin", "*");

しかし、同じ応答にいくつかの異なる許可されたオリジンを追加しようとすると、どちらにもコンテンツを表示させることができませんでした。私にとって、これらのどれもうまくいきませんでした:

  1. いくつかの応答ヘッダーを追加します

    context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine");
    context.Response.AppendHeader("Access-Control-Allow-Origin", "http://someothermachine");
    
  2. ヘッダーを 1 つ追加し、オリジンを 2 つカンマで区切って追加します

    context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine, http://someothermachine");
    
  3. 1 つのヘッダーを追加し、2 つのオリジン スペースを区切って追加します

    context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine http://someothermachine");
    
  4. 1 つのヘッダーを追加し、2 つのオリジン スペースを区切って追加します

    context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine; http://someothermachine");
    

それを機能させるために、私がしたことは、この回答で与えられたアドバイスに従うことでした。私のハンドラーは次のようになります。

public void ProcessRequest(HttpContext context)
{
    string[] allowedOrigins = new string[] { "http://mymachine", "http://someothermachine" };
    string origin = context.Request.Headers.Get("Origin");
    if (allowedOrigins.Contains(origin))
        context.Response.AppendHeader("Access-Control-Allow-Origin", origin);
    context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    context.Response.ContentType = "text/plain";
    context.Response.Write("Hello World " + DateTime.Now.ToString());
}

これにより、Chrome と FF の両方が、両方のオリジンからのハンドラーからの出力を受け入れます。

于 2012-08-17T10:24:39.607 に答える
3

ここでのコードの問題は、Cross Origin応答ヘッダーが実際の要求と共にブラウザーに送信されることですが、実際の要求が行われる前にそこにある必要があります!

W3 は、実際の Cross-Origin HTTP リクエストを送信する前にプリフライト リクエストを実装することをユーザー エージェントに推奨しています。これは、実際のリクエストを含むページへのレスポンス、またはプリフライト リクエストと呼ばれる単純なリクエストへのレスポンスのいずれかを意味します。実際のリクエスト) には、実際のリクエストが行われるときにCross Originレスポンス ヘッダーが含まれている必要があります。

プリフライト リクエストから返されたCross Originヘッダーは、プリフライト結果キャッシュに格納されます。Cross-Origin HTTP リクエストが行われると、ユーザー エージェントはプリフライト結果キャッシュAccess-Control-Allow-Originでヘッダーをチェックし、存在しない場合は次のような例外をスローします。

アドレスを読み込めません。オリジンアドレスは Access-Control-Allow-Origin で許可されていません。

Access-Control-Allow-Originヘッダーを に配置するweb.configと、サーバーから返されたすべての応答にAccess-Control-Allow-Originヘッダーが含まれ、ブラウザ実際のクロスドメイン リクエストを送信します。

最善の策は、実際のクロス ドメイン リクエストを呼び出す前に単純な ajax 呼び出し (プリフライト リクエスト) を行い、そのプリフライト リクエストで必要な応答ヘッダーを送信することです。

于 2012-08-17T10:29:34.843 に答える
1

web.config 項目を場所タグでラップして、ashx の場所に対してのみ実行され、それ以外の場所では実行されないようにすることはできますか?

<location path="~/path/to/handler/arcadeProcessScore.ashx">
<httpProtocol>
   <customHeaders>
      <clear />
      <add name="Access-Control-Allow-Origin" value="http://static1.scirra.net" />
   </customHeaders>
</httpProtocol>
</location>
于 2012-08-17T08:17:41.273 に答える