我自己做了一些测试,直接使用 anXmlHttpRequest
来访问我项目中的处理程序。我使用的设置是在我的本地 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");
添加一个标题,两个来源逗号分隔
context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine, http://someothermachine");
添加一个标题,两个来源空间分隔
context.Response.AppendHeader("Access-Control-Allow-Origin", "http://mymachine http://someothermachine");
添加一个标题,两个来源空间分隔
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 都接受来自两个来源的处理程序的输出。