当我从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!
答案 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请求。