首页 > 解决方案 > CORS 在 Angular 11 和 Asp.net Core 2.1 中不起作用

问题描述

我在使用 angular 11 和 Asp.net Core 2.1.1 中的 CORS 时遇到了一些困难。Angular 服务器在 4201 端口上运行,Asp.net Core 服务器在 8990 端口上运行。我总是收到这样的错误

从源“http://10.31.80.108:4201”访问“http://10.31.80.108:8990/api/localization/login”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

虽然我在 Startup.cs 文件中启用了 CORS:

 app.UseCors(builder => builder.AllowAnyMethod()
                                      .AllowAnyHeader()                                           
                                      .WithOrigins(new []{ "http://10.31.80.108", "http://10.31.80.108:4201"})
                                      //.WithOrigins(origins.ToArray())
                                      .AllowCredentials());

我尝试了应该允许所有请求的不同变体,但它在 Angular 中不起作用。任何人都可以提出一个可能的解决方案吗?

这是启动文件的大部分内容:

 public void ConfigureServices(IServiceCollection services)
    {
 services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {                
           ...
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddMemoryCache();
    //  services.AddCors();
        services.AddCors(o => o.AddPolicy("AllowAnyOrigin", builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader()
                   .AllowCredentials();
        })); }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
       System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(Configuration["CultureOptions:DefaultCulture"]);
        System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(Configuration["CultureOptions:DefaultCulture"]);

        var cultureOptions = new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture(new CultureInfo(Configuration["CultureOptions:DefaultCulture"])),
        };
        var configCultures = Configuration.GetSection("CultureOptions:SupportedCultures").GetChildren();
        configCultures.ForEach(config =>
        {
            cultureOptions.SupportedCultures.Add(new CultureInfo(config.Value));
            cultureOptions.SupportedUICultures.Add(new CultureInfo(config.Value));
        });
        app.UseRequestLocalization(cultureOptions);

        List<string> origins = Configuration.GetSection("Origins:value").Get<List<string>>();
        app.UseCors("AllowAnyOrigin");

 if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            // https://joonasw.net/view/hsts-in-aspnet-core
            app.UseHsts();
        }
        app.UseAuthentication();
        app.UseStaticFiles();
        app.UseSpaStaticFiles();            

      

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action=Index}/{id?}");
        });

        app.UseSpa(spa =>
        {
            spa.Options.SourcePath = "ClientApp";
        });
    }

标签: asp.netangularasp.net-corecorsangular11

解决方案


你有错误的语法。尝试这个

public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(o => o.AddPolicy("AllowAnyOrigins", builder =>
            {
                builder.AllowAnyOrigin()
                       .AllowAnyMethod()
                       .AllowAnyHeader();
            }));
            
        }

        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            .....

            app.UseRouting();
            app.UseCors("AllowAnyOrigins");

            //app.UseAuthorization();
         }

如果可行,请将 AllowAnyOrigin() 替换为您的

 .WithOrigins ("http://10.31.80.108", "http://10.31.80.108:4201");

推荐阅读