在 .net 核心 webAPI 中启用 CORS

Posted

技术标签:

【中文标题】在 .net 核心 webAPI 中启用 CORS【英文标题】:enabling CORS in .net core webAPI 【发布时间】:2019-07-16 05:44:49 【问题描述】:

我已经安装了 NuGet 包 Microsoft.AspNetCore.Cors 2.2.0 然后在我的 .net 核心 webAPI Startup.cs 中,我完成了以下操作:

public void ConfigureServices(IServiceCollection services)  
......
services.AddCors();


public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    

    app.UseCors(options =>
    options.WithOrigins("http://localhost:52556")
    .AllowAnyMethod()
    .AllowAnyHeader());

    app.UseMvc();

然后,当我在控制台中从我的 Angular 应用程序发送发布请求时,我看到了这个错误:

在“http://localhost:52556/api/PaymentDetail”访问 XMLHttpRequest 来自原点“http://localhost:4200”已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

我以为我已经启用了 CORS,但似乎有什么东西阻止了它。有什么办法可以解决这个问题?

【问题讨论】:

你做错了。在localhost:52556 运行的任何东西都不认可原点localhost:4200。我不知道您将显示的代码放在其中的哪个位置,但它的来源错误。 删除 options.WithOrigins 或添加 localhost:4200 ,这样可以正常工作。 【参考方案1】:

我通过注释/属性在 C# 中解决了同样的问题,

[System.Web.Http.Cors.EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*")]
public class StudentsController : ApiController

在 MVC 中, 使用,

// For Action, 
[HttpGet]
[EnableCors("AllowSpecificOrigin")]
public IEnumerable<string> Get()
// For Controller,   
[Route("api/[controller]")]
[EnableCors("AllowSpecificOrigin")]
public class ValuesController : ControllerBase

在你的情况下,用这个替换如果特定于端口号进程4200

options.WithOrigins("http://localhost:4200");

或者你可以输入No Restrictions

app.UseCors("NoRestrictions");// To config
// To service
services.AddCors(options =>

  options.AddPolicy("NoRestrictions",
         builder => builder.WithOrigins("*").AllowAnyHeader().AllowAnyMethod());
);

检查来源是什么, 1) 检查端口号(e.g. 8080 or 8888) 2)域和子域(e.g. google.com or google.net) 3) 架构(e.g. http or https)

注册来源,

进入Startup.ConfigureServices 并致电services.AddCors();

public void ConfigureServices(IServiceCollection services)

    services.AddCors();

现在启用 cors, 转至Startup.Configure 并致电app.UseCors(builder => builder.WithOrigins("http://google.com"));

【讨论】:

【参考方案2】:

试试这个方法。我认为这是因为您只允许带有“http://localhost:52556”的 URL。使用“*”将启用所有 URL,如果您愿意,可以将其限制为任何特定的。

public void ConfigureServices(IServiceCollection services)

  .........................
    services.AddCors(options =>
            
                options.AddPolicy("NoRestrictions",
                    builder => builder.WithOrigins("*").AllowAnyHeader().AllowAnyMethod());
            );;
     ...............


public void Configure(IApplicationBuilder app, IHostingEnvironment env, IOptions<AppServerSettings> appServerSettings)

    ..........
    app.UseCors("NoRestrictions");
    ..........

【讨论】:

AllowSpecificOrigin 应重命名为 NoRestrictions 以查看您的代码 @manish 我补充说,如果他愿意,他可以将其更改为任何特定的 URL。嗯谢谢你的建议。我会编辑它。【参考方案3】:

您正在为您的 asp 主机设置 Origin。

只需替换这一行

options.WithOrigins("http://localhost:52556")

options.WithOrigins("http://localhost:4200")

【讨论】:

以上是关于在 .net 核心 webAPI 中启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

Angular 7 .net 核心 2.2 WebApi Windows 身份验证 CORS

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

CORS asp.net 核心 webapi - 缺少 Access-Control-Allow-Origin 标头

在 ASP.Net Core 5 WebAPI 中启用 CORS

如何在 ASP.net Core WebAPI 中启用 CORS

仅在 IIS 中发布时,在 ASP.net Core 3.1 WebAPI 中启用 CORS 时出错