。NET Core 2.1 Web API中仅用于PUT和DELETE的原因是“所请求的资源上没有'Access-Control-Allow-Origin'标头”

问题描述 投票:0回答:1

我正在使用.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机器上。 GETPOST方法工作正常。当我尝试调用PUTDELETE时,此消息正在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上。

c# .net asp.net-core .net-core kestrel-http-server
1个回答
0
投票

由于在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的这篇文章也为本地或非跨源测试提供了很好的提醒:

https://weblog.west-wind.com/posts/2016/sep/26/aspnet-core-and-cors-gotchas#Watch-out-for-testing-CORS-without-Cross-Domain

CORS标头仅在跨域请求和ASP.NET上发送CORS模块足够聪明,可以检测到是否有相同的域请求触发,如果触发,则不发送标题。

[在Chrome中检查该错误时,请确保您能够查看正在进行的呼叫,并确认所有预检OPTIONS呼叫均包含要查找的标头。该StackOverflow链接介绍了如何在调试中显示OPTIONS请求:

https://stackoverflow.com/a/57669710/13374279

© www.soinside.com 2019 - 2024. All rights reserved.