Angular2:http.get 返回“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”

Posted

技术标签:

【中文标题】Angular2:http.get 返回“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”【英文标题】:Angular2: http.get returns "No 'Access-Control-Allow-Origin' header is present on the requested resource." 【发布时间】:2016-12-19 13:09:56 【问题描述】:

我收到以下错误:

对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

当从我的 angular2 应用程序向我的 web api 发出以下请求时:

     return this.http.get("http://localhost/api/test",  headers )
    .map(res => this.extractData(res))
    .catch(this.handleError);

一些注意事项:

我正在使用 Microsoft.Owin.Cors 请求在不包含标头时可以正常工作。这包括用于身份验证的标头。 我可以使用 Chrome 发出请求。 Microsoft.Owin.Cors 已安装在解决方案中 app.UseCors(CorsOptions.AllowAll);在startup.cs的配置方法的开头

web.config 文件中包含以下内容:

 <system.webServer>
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionControllerv4.0" />
</handlers>

谢谢!

【问题讨论】:

【参考方案1】:

我认为问题在于您没有在服务器端配置预检请求(对于 OPTIONS 方法)。

CORS 有两种请求:

简单的请求。如果我们使用 HTTP GET、HEAD 和 POST 方法,则此用例适用。对于 POST 方法,仅支持具有以下值的内容类型:text/plain、application/x-www-form-urlencoded 和 multipart/form-data。 预检请求。当“简单请求”用例不适用时,会发出第一个请求(使用 HTTP OPTIONS 方法)以检查在跨域请求的上下文中可以做什么。

添加标头时,您会从简单请求切换到预检请求。因此,OPTIONS 请求在目标请求之前在后台执行。

查看这篇文章了解更多详情:

http://restlet.com/blog/2015/12/15/understanding-and-using-cors/

【讨论】:

他们提到问题是服务器在预先请求的响应中不包含标头,但他们没有提到如何做到这一点?另外,我认为 app.UseCors(CorsOptions.AllowAll);会解决这个问题吗?【参考方案2】:

将这些行添加到webapiconfig.cs 文件中

var cors = new EnableCorsAttribute("", "", "*"); 
config.EnableCors(cors);

您可以在ApplicationOAuthProvider.cs 中再做一件事在GrantResourceOwnerCredentials 方法中添加这一行

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[]  "*" );

【讨论】:

我认为这适用于 Microsoft.AspNet.WebApi.Cors,我正在使用 Microsoft.Owin.Cors。很抱歉遗漏了这个细节。我会相应地更新问题。 我正在使用 System.Web.Http.Cors;好的

以上是关于Angular2:http.get 返回“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 HTTP GET - 将响应转换为完整对象

Angular2 - 在另一个 Observable 中使用 Observable 返回方法的值

Angular2 http.get() ,map(), subscribe() 和 observable 模式 - 基本理解

从 HTTP GET 返回自定义对象列表以在 Angular 2 应用程序中使用

Ionic2,Angular2:如何在使用 http get 进行 REST API 服务调用时避免 CORS 问题?

Angular 2 http get observable 调用了两次