ASP.net相同的原始策略标头不起作用

时间:2012-08-14 17:55:16

标签: asp.net iis-7 cross-domain iis-7.5 same-origin-policy

我收到了错误:

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的请求?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

您的代码存在的问题是, Cross Origin 响应标头会发送到浏览器 实际请求,而之前必须 / strong>实际要求!

W3 recommends 用户代理在提交实际的跨源HTTP请求之前实现预检请求,这意味着对包含该页面的响应在发出实际请求时,实际请求或对称为预检请求的简单请求(在实际请求之前做出)的响应必须包含 Cross Origin 响应标头。

预检请求返回的

Cross Origin 标头存储在预检结果缓存中。发出跨域HTTP请求时,用户代理会检查预检结果缓存中的Access-Control-Allow-Origin标头,如果不是,则抛出异常,说明:

  

无法加载地址,Access-Control-Allow-Origin不允许使用Origin 地址

当您在Access-Control-Allow-Origin中添加web.config标头时,从服务器返回的任何响应都包含Access-Control-Allow-Origin标头,浏览器提交实际跨域请求。

您最好的选择是在调用实际的跨域请求之前进行简单的ajax调用(预检请求),并发送该预检请求所需的任何响应标头。

答案 1 :(得分: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>