问题一
报错:
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-