【问题标题】:Cannot figure out CORS in .net core 3.1 web api无法在.net core 3.1 web api中找出CORS
【发布时间】: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(); 把它移过来
  • 把它移过来?去哪里?

标签: c# reactjs asp.net-core cors


【解决方案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();
                });
            }
    

    【讨论】:

      猜你喜欢
      • 2020-04-18
      • 1970-01-01
      • 2021-02-14
      • 2020-05-23
      • 2020-07-30
      • 2020-04-27
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多