ASP.NET Core 跨域请求(CORS)遇到的问题

问题一

报错:
Access to XMLHttpRequest at 'http://api.test.com/xxx' from origin 'http://www.test.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

这是典型的跨越报错,如果你是新手需要了解什么是跨域请参考 同源策略

解决方法:

1.打开 Startup.cs 文件,在顶部定义一个策略名称 _myAllowSpecificOrigins ,策略名称可以是任意名称。

public class Startup
{
    readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
    //user code ……
}

2.在ConfigureServices方法中,配置CORS 策略,指定来源。

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy(name: MyAllowSpecificOrigins,
                          builder =>
                          {
                              builder.WithOrigins("http://www.test1.com",
                                                  "http://www.test2.com");
                              });
        });
        //user code ……
    }

3.在Configure方法中
调用 UseCors扩展方法并指定 _myAllowSpecificOrigins CORS 策略。
注意:UseCors添加 CORS 中间件时,必须将对的调用 UseCors 置于之后 UseRouting 但在之前 UseAuthorization

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //user code ……
    app.UseRouting();//UseRouting之后

    app.UseCors(MyAllowSpecificOrigins);
        
    app.UseAuthorization();//UseAuthorization之前
    //user code ……
}

如果还是没能解决问题,请浏览文章末尾的「参考」,微软官方文档里还有其它两种方法可启用 CORS


问题二:

报错:
Access to XMLHttpRequest at 'http://api.test.com/xxx' from origin 'http://www.test.com' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

默认情况下,浏览器不会向应用程序公开所有的响应标头。
默认情况下可用的响应标头包括:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

CORS 规范将这些标头称为简单的响应标头。
若要使其他标头可用于应用程序,需要在配置CORS 策略时添加指定响应标头。

解决方法:

在上面「问题一」「步骤2 」ConfigureServices方法中,配置CORS 策略时,指定需要的响应标头,比如报错示例的Access-Control-Allow-Headers

using Microsoft.Net.Http.Headers;//HeaderNames需引用命名空间

//user code ……

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy(name: MyAllowSpecificOrigins,
                          builder =>
                          {
                              builder.WithOrigins("http://www.test.com")
                                     .WithHeaders(HeaderNames.ContentType, "Access-Control-Allow-Headers");//using Microsoft.Net.Http.Headers;
                              });
        });
        //user code ……
    }

若要允许所有请求响应标头,请调用AllowAnyHeader方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy(name: MyAllowSpecificOrigins,
                          builder =>
                          {
                              builder.WithOrigins("http://www.test.com")
                                     .AllowAnyHeader();
                              });
        });
        //user code ……
    }

-END-


参考:在 ASP.NET Core 中启用跨域请求(CORS)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容