在Chrome v36中工作的CORS在Chrome v37中失败

时间:2014-09-10 12:41:42

标签: jquery ajax google-chrome iis cors

当我从Chrome v36.xxx更新到v37.yyy(特别是37.0.2062.103)时,我花了几天的时间试图确定我的CORS应用程序突然在Chrome中失败的原因在我的应用程序中我运行了一个MVC站点和另一个端口上的WebAPI。这是跨域进入事物的地方。

我有几个实例(dev,uat,prod)都以同样的方式行事。都习惯了。

XMLHttpRequest无法加载 HTTP://" mywebapihost":" mywebapiport" /api/v1.0/myapp/。没有 '访问控制允许来源'标题出现在请求的上 资源。起源' http://" mymvchost"'因此不允许访问。

预检中的OPTIONS请求似乎存在问题 - 我已经在网上看到了很多。

然而 - 我不觉得更接近"修复"我的问题("修复" ==能够在Chrome中运行)。

我可以说明我的系统的事情:

(1)一直使用v36.xxx,但自37.0.2062.103更新以来没有 (2)在IE中工作 (3)即使在最新的Chrome中也适用于GET (4)即使在最新的Chrome中也能正常工作。如果我有Fiddler跑步(我不认为这是一个修复!)

我尝试了什么。

1)在调用jQuery Ajax调用中强制标头尝试将授权转换为OPTIONS调用 - 来自Web的建议

beforeSend: function (xhr) {
   xhr.setRequestHeader('Authorization', make_base_auth("<username>", "<password>"));
},
headers: {
   "Authorization": "Basic " + btoa("<username>" + ":" + "<password>")
}

2)我下载了Chrome Canary v39.0.2150.3,希望这个问题不复存在 - 仍然会出现同样的失败。

如果有人有任何建议我会非常感激,为了取得进展,我必须改为运行IE!

2 个答案:

答案 0 :(得分:0)

为了封闭,我在这里回答我自己的问题。它可能在将来帮助某人。

我所做的是创建一个完全干净,最小化的WebAPI项目,该项目实现了GET,PUT,POST和DELETE。我按预期工作,然后尝试跨域(相同的服务器,但运行JS Ajax的网页在端口80上,WebAPI在端口7694上运行)。

这可以预见地失败了。所以我用所需的nuget包启用了CORS,添加了

        config.EnableCors();
WebApiConfigcs中的

在我的最小WebAPI控制器中,我添加了

[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)]

所有这些都按预期工作。

然而,当我将相同的Controller等安装到我现有的失败的WebAPI部署中时,它以提示我原始问题的方式失败。

所以它有关于它的配置气味。

通过清理我正在部署的IIS服务器和WebAPI项目的配置,结果证明了这一点。当我试图让飞行前的OPTIONS请求工作时,我用两者都戳了太多。

特别是,在Web.Config中我添加了

  <system.web>
    ....
    ....
    <!--<authentication mode="Windows" />-->
    <authorization>
      <deny users="?" />
      <allow verbs="OPTIONS" users="?" />
    </authorization>
  </system.web>

并且

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>

遵循网络上的建议。

我删除了这些内容并开始工作。

我很欣赏这是一个模糊的答案,但它可能会让人感到沮丧,我已经好几天了。

克里斯

答案 1 :(得分:0)

我遇到了同样的问题。我刚刚更新到Chrome 38(38.0.2125.101米)并且问题仍然存在。如下所示,我在此处删除了我的答案并创建了一个新问题:Chrome v37/38 CORS failing (again) with 401 for OPTIONS pre-flight requests

正如您将在该问题中看到的,我的Angular应用程序正在发送明确的withCredentials,因此服务器应该正确验证预先发出的OPTIONS请求。