无法在.net core 3.1 web api中找出CORS

Posted

技术标签:

【中文标题】无法在.net core 3.1 web api中找出CORS【英文标题】:Cannot figure out CORS in .net core 3.1 web api 【发布时间】:2020-08-27 14:34:52 【问题描述】:

我已尝试将所有方法调用移动不少于 10,000 次。我需要尝试第 10,001 次才能成为获胜者! 我做错了什么?

我不断收到与 CORS 相关的错误,但我已按照指南尝试解决它。​​

        public void ConfigureServices(IServiceCollection services)
        
            services.AddCors(options =>
            
                options.AddDefaultPolicy(
                    builder =>
                    
                        builder.WithOrigins("http://localhost:3000").AllowAnyHeader().AllowAnyMethod();
                    );
            );
            //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
            services.AddControllers();
            services.AddAuthentication(IISDefaults.AuthenticationScheme);
            services.AddSwaggerGen();
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "MES vs API");
            );

            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseCors("AllowAnyOrigin");
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
        

在反应中,我有这个:

fetch('http://localhost:44387/api/Users/GetTest').then(function (response) 
      this.state.user = response.text();
);

【问题讨论】:

我已经设法让客户端上的 API 调用保持在(待定)状态。所以有…………那个…… 请在您的 React 应用中打开开发控制台并检查控制台“网络”选项卡下的 HTTP 调用。在特定调用中,响应标头中存在“Access-Control-Allow-Origin”标头? 直到我在 Startup.cs 中搞砸了——导致我发布了代码。现在它一直处于挂起状态,然后最终失败,并在 F12 中出现 CONNECTION_RESET 错误。这需要几分钟时间。 app.UseHttpsRedirection(); 把它移过来 把它移过来?去哪里? 【参考方案1】:

您正在发出 http 请求,但您启用了 HttpsRedirection。

如果您在没有 https 的情况下进行开发,您应该将 app.UseHttpsRedirection(); 调用移动到仅在生产中运行的代码块中。例如

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    
    else // Production
    
        app.UseHttpsRedirection();
    

    app.UseSwagger();
    app.UseSwaggerUI(c =>
    
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MES vs API");
    );

    app.UseRouting();
    app.UseCors(); // Use default policy as defined in example code
    //...

您还添加了默认的 CORS 策略,但是当您调用 UseCors() 时,您使用的是命名策略 (AllowAnyOrigin)。

要么定义一个命名策略“AllowAnyOrigin”,要么直接调用app.UseCors(); 来使用默认策略。

Documentation on CORS in .net core

【讨论】:

这是否改变了它可以在 http 和 https 模式下工作? @MuhammetCaylak 正在开发 http 和 https(如果安装了证书)。在生产中它只会使用 https【参考方案2】:

你可以试试这样用吗?

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    if (env.IsDevelopment())
    
       app.UseDeveloperExceptionPage();
    
    app.UseCors("AllowAnyOrigin");
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    
       c.SwaggerEndpoint("/swagger/v1/swagger.json", "MES vs API");
    );

    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    
       endpoints.MapControllers();
    );

【讨论】:

【参考方案3】:

我在设置 CORS 策略时将它用于依赖注入容器

            //CORS CONFIGURATION
            services.AddCors(options =>
            
                options.AddPolicy("CorsPolicy",
                builder => builder.SetIsOriginAllowed(_ => true)
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
            );

然后应用 CORS 政策

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseRouting();

            //ALLOW CORS
            app.UseCors("CorsPolicy");

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
        

【讨论】:

以上是关于无法在.net core 3.1 web api中找出CORS的主要内容,如果未能解决你的问题,请参考以下文章

在 .Net Core 3.1 的 Web Api 中无法使用 Cors [重复]

C# 和 Docker - 无法从容器化 .NET Core 3.1 Web API 连接到容器化 MySQL 服务器

ASP.NET Core 3.1 Web Api HttpPost Action 参数无法接收 axios application/json HttpPost 传递数据

如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?

NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)

我需要在启动时在 ASP .Net Core 3.1 Web API 中执行异步方法