'Access-Control-Allow-Origin' header 包含多个值
'Access-Control-Allow-Origin' header 包含多个值
我在客户端使用AngularJS的$http来访问服务器端的ASP.NET Web API应用程序的一个端点。由于客户端和服务器端在不同的域上,所以我需要CORS。对于$http.post(url, data)方法,它是工作正常的。但是,一旦我对用户进行身份验证并通过$http.get(url)方法发送请求,我就会收到以下消息:\n
\n\'Access-Control-Allow-Origin\'头包含多个值\'http://127.0.0.1:9000, http://127.0.0.1:9000\',但只允许一个值。因此,源\'http://127.0.0.1:9000\'无法访问。\n
\nFiddler向我显示,在成功的options请求之后,get请求中确实有两个头部条目。我在哪里做错了? \n更新\n当我使用jQuery的$.get方法代替$http.get时,出现了相同的错误消息。所以这似乎不是AngularJS的问题。但是我在哪里出错了呢?
问题出现的原因是服务器返回了重复的Access-Control-Allow-Origin和Access-Control-Allow-Header头部信息。解决方法是从WebApiConfig.cs文件中移除config.EnableCors()代码,并且在Controller类上设置[EnableCors("*","*","*")]属性。确保在web.config文件中没有设置类似<add name="Access-Control-Allow-Origin" value="*" />的配置项。
使用Cors 5.1.0.0版本时,我遇到了许多问题,经过一番苦苦挣扎,发现问题出在服务器返回了重复的Access-Control-Allow-Origin和Access-Control-Allow-Header头部信息。为了解决这个问题,我在WebApiConfig.cs文件中移除了config.EnableCors()代码,并且在Controller类上设置了[EnableCors("*","*","*")]属性。这样做之后,问题得到了解决。
如果你也遇到了类似的问题,我建议你查看这篇文章(链接:http://msdn.microsoft.com/en-us/magazine/dn532203.aspx),其中有更详细的信息。
对我来说,这种解决方法非常有效。只需确保在web.config文件中没有设置类似<add name="Access-Control-Allow-Origin" value="*" />的配置项即可。这样做之后,问题就解决了。
问题的原因是在服务器上添加了两个头部条目,解决方法是只使用后面一个头部条目。
这个问题的出现是因为在服务器上添加了两个头部条目。在代码中,首先使用了config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "*", "*"))
,然后又使用了app.UseCors(CorsOptions.AllowAll)
,导致了两个头部条目的出现。解决方法是只使用后面一个头部条目,即app.UseCors(CorsOptions.AllowAll)
。
根据代码中的提示信息,可以推测Properties.Settings.Default.Cors
是从一个设置文件中读取的。下面的代码给出了一个示例:
Properties.Settings.Default.Cors = "http://example.com";
另外,UseCors
是在Microsoft.Owin.Cors
NuGet包中定义的一个扩展方法。可以在katanaproject.codeplex.com/SourceControl/latest#src/…中查看相关代码。
config.EnableCors(enableCorsAttribute)通常在WebApiConfig.cs
中调用,这是Microsoft.AspNet.WebApi.Cors
NuGet包的一部分。可以在asp.net/web-api/overview/security/…中找到有关使用该包的描述。
app.UseCors(CorsOptions.AllowAll)通常在Startup.Auth.cs
中调用,作为配置身份提供者(例如OAuth)的一部分,它也是Microsoft.Owin.Cors
NuGet包的一部分。
需要注意的是,在IAppBuilder app
中使用CorsExtensions.UseCors(app, CorsOptions.AllowAll)
。
在解决问题时,如果只需要对整个站点的所有调用进行CORS处理,可以在OWINStartup配置中删除app.UseCors
。
问题的出现原因是因为在web.config中设置了自定义的头部<add name="Access-Control-Allow-Origin" value="*"/>
,同时又按照最佳实践设置了CORS。解决方法是移除web.config中的自定义头部设置。
以下是其他人提供的一些解决方法:
- 删除web.config中的<add name="Access-Control-Allow-Origin" value="*"/>
,保留其他两个头部设置<add name="Access-Control-Allow-Headers" value="Content-Type" />
和<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
- 只能启用一次CORS,所以需要移除web.config中的设置,只使用app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
方法
- 确保只启用一次CORS,否则会出现问题
以上是一些解决方法,希望能帮助解决这个问题。