Jquery CORS,在Chrome v36中工作,在Chrome v37中失败

Jquery CORS,在Chrome v36中工作,在Chrome v37中失败,jquery,ajax,google-chrome,iis,cors,Jquery,Ajax,Google Chrome,Iis,Cors,我花了几天时间试图找出为什么我的CORS应用程序在Chrome上突然开始失败,当我从Chrome v36.xxx更新到v37.yyy(特别是37.0.2062.103)时,我的应用程序在不同的端口上运行MVC站点和WebAPI。这就是跨领域进入事物的地方 我有几个实例(dev、uat、prod)都以相同的方式运行。所有的人都曾经工作过 无法加载XMLHttpRequest http://“mywebapihost”:“mywebapiport”/api/v1.0/myapp/。不 “Access

我花了几天时间试图找出为什么我的CORS应用程序在Chrome上突然开始失败,当我从Chrome v36.xxx更新到v37.yyy(特别是37.0.2062.103)时,我的应用程序在不同的端口上运行MVC站点和WebAPI。这就是跨领域进入事物的地方

我有几个实例(dev、uat、prod)都以相同的方式运行。所有的人都曾经工作过

无法加载XMLHttpRequest http://“mywebapihost”:“mywebapiport”/api/v1.0/myapp/。不 “Access Control Allow Origin”标头出现在请求的服务器上 资源。因此,不允许访问源“http://“mymvchost”

飞行前的选项请求似乎有问题,我在网上看到过很多

然而,我并不觉得自己更接近于“修复”我的问题(其中“修复”==能够在Chrome中运行)

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

(1) 一直使用v36.xxx,但自37.0.2062.103更新以来未使用过 (2) 在IE工作 (3) 在最新的Chrome浏览器中,它的作用是达到平衡 (4) 即使在最新的Chrome浏览器中也能正常工作。如果我让Fiddler运行(我不认为这是修复!)

我试过的

1) 在调用jQueryAjax调用中强制使用标题,以尝试将授权输入到来自web的选项调用建议中

beforeSend: function (xhr) {
   xhr.setRequestHeader('Authorization', make_base_auth("<username>", "<password>"));
},
headers: {
   "Authorization": "Basic " + btoa("<username>" + ":" + "<password>")
}
发送前:函数(xhr){
setRequestHeader('Authorization',make_base_auth(“,”);
},
标题:{
“授权”:“基本”+btoa(“+”:“+”)
}
2) 我下载了ChromeCanaryV39.0.2150.3,希望这个问题能够解决——仍然会遇到同样的失败


如果有人有任何建议,我将不胜感激,我不得不改用IE来取得进步

为了结束,我在这里回答我自己的问题。它可能会在将来帮助别人

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

这是可以预见的失败。因此,我使用所需的nuget包启用了CORS,并添加了

        config.EnableCors();
[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)]
在WebApiConfigcs中

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

        config.EnableCors();
[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)]
所有这些都如期发挥作用

然而,当我将同一个控制器etc安装到我现有的失败的WebAPI部署中时,它以引发我最初问题的方式失败了

所以它有一股配置的味道

事实证明,通过清理IIS服务器和正在部署的WebAPI项目的配置,可以修复此问题。当我试图让飞行前的选择请求生效时,我对这两个方面都做了太多的尝试

Specificall,在我添加的Web.Config中

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

....
....


当在网上看到以下建议时

我把这两个都去掉了,事情就开始起作用了

我很感激这是一个模糊的答案,但它可能会拯救一些人的挫折,我有几天


克里斯

我也有同样的问题。我刚刚更新到Chrome38(38.0.2125.101 m),问题依然存在。如下所示,我已在此处删除了我的答案,并创建了一个新问题:


正如您在该问题中所看到的,我的Angular应用程序正在发送一个带有凭据的显式
,因此服务器应该正确验证预装选项请求。

报告的来源显然是错误的。是否从本地计算机上运行此测试?进行编辑。我在中为mvc主机、webapi主机和webapi端口添加了占位符,但是,因为我将它们放在“”中,所以它们没有出现在帖子中。顺便说一句,mvc主机和web api主机是相同的。只是端口不同,显然仍然分类为“跨域”。你能调试服务器,看看为什么它没有附加访问控制允许源标题吗?@Ryven:我确实拥有对服务器的完全访问权限是的。这是在IIS上运行的(我以前更喜欢Java/Tomcat),但我确实可以访问所有配置文件和日志文件。事情是这样的,如果我使用诸如“Postman”(Chrome插件)之类的工具发出一个明确的选项请求,它就会通过。失败的地方不仅是Chrome,还有Firefox,是使用jQuery Ajax()为POST或补丁请求自动生成的飞行前选项。我认为它只是通过Chrome显示的,因为更新使它更加严格。您的请求缺少
授权
请求标题。您是否设置了
xhr.withCredentials=true
?你能删除这个“答案”并发布一个包含选项请求和最终响应的请求标题和响应标题的新问题吗?Rob,请查看我新添加的问题(上面的链接)