为啥调用 API 时出现 CORS 错误

Posted

技术标签:

【中文标题】为啥调用 API 时出现 CORS 错误【英文标题】:Why I'm having CORS error when calling an API为什么调用 API 时出现 CORS 错误 【发布时间】:2020-06-17 16:41:34 【问题描述】:

我在前端使用Angular,在后端使用C#,当我尝试编辑字段并保存时出现此错误:

Access to XMLHttpRequest at 'http://192.168.220.14:81/api/registry' from origin 'http://artc.tj' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

PUT http://192.168.220.14:81/api/reg polyfills-es2015.23e79c711e3c227d781f.js:1 PUT http://192.168.220.14:81/api/registry net::ERR_FAILED

Error Scrinshot

Startup.cs:

 public void ConfigureServices(IServiceCollection services)
 
     //CORS
     services.AddCors(options =>
     
         options.AddPolicy(MyAllowSpecificOrigins,
         builder =>
         
             builder.WithOrigins("http://localhost",
                                 "http://localhost:4200",
                                 "http://artc.tj",
                                 "http://192.168.220.14")
                                    .AllowAnyMethod()
                                    .AllowAnyHeader()
                                    .AllowCredentials();
         );
     );
  

【问题讨论】:

响应的 HTTP 状态码是什么?您可以使用浏览器开发工具中的网络窗格进行检查。是 4xx 还是 5xx 错误而不是 200 OK 成功响应? 你在configure方法中添加app.UseCors(MyAllowSpecificOrigins); 了吗? 我猜你注册中间件太晚了。见***.com/a/60038513/5517088 这能回答你的问题吗? ASP.NET 5/Core/vNext CORS not working even if allowing pretty much everything 【参考方案1】:

确保在 Configure 方法中使用 Cors()

Startup.cs

public class Startup

   //...
   readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

   public void ConfigureServices(IServiceCollection services)
   
      //...
         services.AddCors(options =>
         
             options.AddPolicy(MyAllowSpecificOrigins,
             builder =>
             
                 builder.WithOrigins("http://localhost:4200")
                     .AllowAnyHeader()
                     .AllowAnyMethod()
                     .AllowAnyOrigin();
             );
         );
      //...
   

   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   
      //...
      app.UseCors(MyAllowSpecificOrigins);
      //...
   
   //...

附:还要确保在您的客户请求中包含withCredentials: false httpOptions

【讨论】:

【参考方案2】:

我认为您在从Angular 端发送请求时缺少标头。这是我通常做的:

Startup.cs

public void ConfigureServices(IServiceCollection services)

     services.AddCors(options =>
     
         options.AddPolicy("Default", policy =>
         
             policy.AllowAnyOrigin()
                   .AllowAnyHeader()
                   .AllowAnyMethod();
         );
     );


public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    app.UseCors("Default");

角度请求:

callAPI() 
   return this.httpClient
            .get(API_URL, headers: 'Access-Control-Allow-Origin' : '*');

【讨论】:

客户端不决定服务器授予谁访问权限。 Access-Control-Allow-Origin 是服务器发送的响应头【参考方案3】:

你没有。您向其发出请求的服务器必须实施 CORS 以授予 javascript 从您的网站访问权限。您的 JavaScript 无法授予自己访问其他网站的权限。

使用来自 chrome 浏览器网络商店的 CORS 扩展。

希望这可能会改变你的看法

【讨论】:

以上是关于为啥调用 API 时出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

调用非官方 Airbnb API 时出现 CORS 错误 [关闭]

从 localhost Vue 项目调用 api 时出现 NodeJS CORS 错误

Angular 调用 Eureka API 时出现 CORS 来源错误

从 Ajax 调用 Spring Boot Rest API 时出现 CORS 错误

从 Angular 客户端调用 API 时出现身份服务器 CORS 错误

在 Angular 中调用远程 URL 时出现 CORS 策略错误