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", "*");
しかし、同じ応答にいくつかの異なる許可されたオリジンを追加しようとすると、どちらにもコンテンツを表示させることができませんでした。私にとって、これらのどれもうまくいきませんでした:
いくつかの応答ヘッダーを追加します
context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine");
context.Response.AppendHeader("Access-Control-Allow-Origin", "http://someothermachine");
ヘッダーを 1 つ追加し、オリジンを 2 つカンマで区切って追加します
context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine, http://someothermachine");
1 つのヘッダーを追加し、2 つのオリジン スペースを区切って追加します
context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine http://someothermachine");
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 の両方が、両方のオリジンからのハンドラーからの出力を受け入れます。