問題一
報錯:
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方法中
調(diào)用 UseCors擴展方法并指定 _myAllowSpecificOrigins CORS 策略。
注意:UseCors添加 CORS 中間件時,必須將對的調(diào)用 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.
默認情況下,瀏覽器不會向應(yīng)用程序公開所有的響應(yīng)標(biāo)頭。
默認情況下可用的響應(yīng)標(biāo)頭包括:
- Cache-Control
- Content-Language
- Content-Type
- Expires
- Last-Modified
- Pragma
CORS 規(guī)范將這些標(biāo)頭稱為簡單的響應(yīng)標(biāo)頭。
若要使其他標(biāo)頭可用于應(yīng)用程序,需要在配置CORS 策略時添加指定響應(yīng)標(biāo)頭。
解決方法:
在上面「問題一」「步驟2 」ConfigureServices方法中,配置CORS 策略時,指定需要的響應(yīng)標(biāo)頭,比如報錯示例的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 ……
}
若要允許所有請求響應(yīng)標(biāo)頭,請調(diào)用AllowAnyHeader方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://www.test.com")
.AllowAnyHeader();
});
});
//user code ……
}
-END-