我在客户端使用AngularJS $ http访问服务器端ASP.NET Web API应用程序的端点.由于客户端作为服务器托管在不同的域上,因此我需要CORS.它适用于$ http.post(url,data).但是只要我通过$ http.get(url)对用户进行身份验证并发出请求,我就会收到消息
The 'Access-Control-Allow-Origin' header contains multiple values 'http://127.0.0.1:9000, http://127.0.0.1:9000', but only one is allowed. Origin 'http://127.0.0.1:9000' is therefore not allowed access.
Fiddler告诉我,在成功的选项请求之后,get请求中确实有两个头条目.我做错什么地方在哪里?
更新
当我使用jQuery $ .get而不是$ http.get时,会出现相同的错误消息.所以AngularJS似乎没有问题.但哪里错了?
我们就遇到了这个问题,因为我们已经根据最佳实践建立CORS(如http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api)AND ALSO <add name="Access-Control-Allow-Origin" value="*"/>
在web.config中有一个自定义标题.
删除web.config条目,一切都很好.
与@ mww的答案相反,我们仍然EnableCors()
在WebApiConfig.cs和EnableCorsAttribute
控制器上.当我们拿出一个或另一个时,我们遇到了其他问题.
我补充道
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))
以及
app.UseCors(CorsOptions.AllowAll);
在服务器上.这导致两个标题条目.只需使用后者即可.
我正在使用Cors 5.1.0.0,经过多次头痛,我发现问题是从服务器复制Access-Control-Allow-Origin和Access-Control-Allow-Header头
config.EnableCors()
从WebApiConfig.cs文件中删除,只需[EnableCors("*","*","*")]
在Controller类上设置属性即可
查看此文章了解更多详细信息.
实际上你不能设置多个标题Access-Control-Allow-Origin
(或者至少它不适用于所有浏览器).相反,您可以有条件地设置环境变量,然后在Header
指令中使用它:
SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1 Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
因此,在此示例中,仅当请求标头Origin
与RegExp匹配时才会添加响应标头:( ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$
它基本上表示通过HTTP或HTTPS的本地主机和基于HTTPS的*.my.base.domain).
记得启用setenvif
模块.
文档:
http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif
http://httpd.apache.org/docs/2.2/mod/mod_headers.html#header
BTW.在}e
中%{ORIGIN_SUB_DOMAIN}e
是不是一个错字.这是你在Header
指令中使用环境变量的方式.
Apache服务器:
我花了同样的钱,但那是因为我的文件中没有引号(")星号提供了对服务器的访问,例如'.htaccess.':
Header add Access-Control-Allow-Origin: * Header add Access-Control-Allow-Origin "*"
你也可能在另一个'.htaccess'文件夹中有一个'.htaccess'文件,例如
/ - .htaccess - public_html / .htaccess (problem here)
在您的情况下,而不是'*'星号将是http://127.0.0.1:9000
您提供服务数据的权限的ip()服务器.
ASP.NET:
检查代码中是否存在"Access-Control-Allow-Origin"副本.
开发者工具:
使用Chrome,您可以验证您的请求标头.按F12键并转到"网络"选项卡,现在运行AJAX请求并显示在列表中,单击并提供所有信息.
我既有OWIN也有我的WebAPI,两者显然都需要单独启用CORS,这反过来又会产生'Access-Control-Allow-Origin' header contains multiple values
错误.
我最终删除了启用CORS的所有代码,然后将以下内容添加到system.webServer
我的Web.Config节点:
<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" /> </customHeaders> </httpProtocol>
为OWIN(允许登录)和WebAPI(允许API调用)执行此满足的CORS要求,但它创建了一个新问题:OPTIONS
在我的API调用的预检期间找不到方法.解决这个问题很简单 - 我只需要从handlers
我的Web.Config节点中删除以下内容:
<remove name="OPTIONSVerbHandler" />
希望这有助于某人.