我正在使用.NET Core 2.1。我已将Startup.cs配置如下:
public class Startup
{
public static IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors(builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
Web API已部署在Linux机器上。 GET
和POST
方法工作正常。当我尝试调用PUT
或DELETE
时,此消息正在Chroome
控制台中生成。
Access to XMLHttpRequest at 'http://IP' from origin 'http://IP' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
最初,Kestrel已在50001
上列出,因为存在SSL证书。我在appsettings.json
中将Kestrel配置为仅在5000
上收听。因此,现在它仅在5000
上列出。
appsettings.json
{
"Kestrel": {
"EndPoints": {
"Http": {
"Url": "http://localhost:5000"
}
}
}
}
我已经尝试过此线程How to enable CORS in ASP.net Core WebAPI中给出的几乎所有答案
在我的情况下,他们都没有工作。
[Origin
是我的本地主机,Web API在实时IP上。
由于在PUT和DELETE调用上出现了特定的故障,听起来您仍然遇到preflight requests的问题
每https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1#preflight-requests-1:
Preflight请求对于某些CORS请求,浏览器会发送在提出实际要求之前,需要额外的要求。这个要求是称为预检请求。浏览器可以跳过预检请求如果满足以下条件:
- 请求方法是GET,HEAD或POST。
- 该应用未设置请求除Accept,Accept-Language,Content-Language,Content-Type或Last-Event-ID。
- Content-Type标头(如果已设置,则具有以下值之一:
- 应用程序/ x-www-form-urlencoded
- multipart / form-data
- 文本/纯文本
很难单独对上面的内容进行故障排除,而又不知道在Kestrel和网络之间是否存在诸如Nginx或其他反向代理之类的东西可能会影响标题。在测试过程中,Rick Strahl的这篇文章也为本地或非跨源测试提供了很好的提醒:
CORS标头仅在跨域请求和ASP.NET上发送CORS模块足够聪明,可以检测到是否有相同的域请求触发,如果触发,则不发送标题。
[在Chrome中检查该错误时,请确保您能够查看正在进行的呼叫,并确认所有预检OPTIONS呼叫均包含要查找的标头。该StackOverflow链接介绍了如何在调试中显示OPTIONS请求: