gpt4 book ai didi

c# - CORS 不适用于 .NET Core API 和 Angular 前端

转载 作者:行者123 更新时间:2023-12-05 06:56:44 25 4
gpt4 key购买 nike

我已经通读了类似的问题,尝试了其中提到的几个解决方案但没有成功 - 问题很简单,我真的不知道到底是哪里出了问题...

我有一个非常简单的 .NET Core API,我想在其上设置 CORS。

我试过这种方式(端点路由):https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0#enable-cors-with-endpoint-routing

Startup.cs 中的 ConfigureServices() 和 Configure() 方法

就是默认的,默认生成的,只是添加了MSDN的CORS相关代码。

      public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: "Policy1",
builder =>
{
// I read the site url from appsettings.json but for now I want to keep the example as simple as I can
// var lpSolverFrontendUrl = Configuration.GetValue<string>("Cors:AllowedSite");
builder.WithOrigins("http://localhost:4200").AllowAnyHeader().AllowAnyMethod();
});
});
services.AddControllers();
}

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

app.UseHttpsRedirection();

app.UseRouting();

app.UseCors();

app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers().RequireCors("Policy1");
});
}

我的 Controller 类

    [Route("[controller]/[action]")]
public class SimplexSolverController : Controller
{
public IActionResult Ping()
{
return Json(new { status = "OK" });
}

[HttpPost]
public IActionResult Solve([FromBody] LPModelDto lpModelDto)
{
bool wrongFormat = false;
string message = null;
SimplexSolutionDto solution = null;
//...
}
//...
}

我已经尝试过的另一种方法(带属性):https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-5.0#enable-cors-with-attributes

这样的Startup.cs

        public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(name: "Policy1",
builder =>
{
// I read the site url from appsettings.json but I want to keep the example as simple as I can
// var lpSolverFrontendUrl = Configuration.GetValue<string>("Cors:AllowedSite");
builder.WithOrigins("http://localhost:4200").AllowAnyHeader().AllowAnyMethod();
});
});
services.AddControllers();
}

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

app.UseHttpsRedirection();

app.UseRouting();

app.UseCors();

app.UseAuthorization();

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

我的 Controller 类是这样的

我将 EnableCors 属性放在 Controller 方法上以在其上启用 CORS。

    [Route("[controller]/[action]")]
public class SimplexSolverController : Controller
{
public IActionResult Ping()
{
return Json(new { status = "OK" });
}

[EnableCors("Policy1")]
[HttpPost]
public IActionResult Solve([FromBody] LPModelDto lpModelDto)
{
bool wrongFormat = false;
string message = null;
SimplexSolutionDto solution = null;
//...
}
//...
}

无论我选择哪种方式,我都会在 DevTools 控制台中收到错误消息,例如:Access to XMLHttpRequest at 'http://localhost:4000/simplexsolver/solve' from origin 'http://localhost:4200'已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin” header 。

我完全按照文章所说的进行操作,但没有任何结果......感谢任何帮助!

更新

我终于成功启用了CORS。可悲的是,我无法在 ConfigureServices 中设置任何类型的策略,因为如果我这样做,Access-Control-Allow-Origin header 将在预检中具有“*”值(不是前端地址)请求的响应。我使用的方式是:

  • 在ConfigureServices()方法中只添加CORS,不添加任何策略
  • 在 Configure() 中,我将允许量确定为 UseCors() 方法的参数(不需要以这种方式将 EnableCors 属性放在 Controller mmethod 上。)

现在我在 Startup.cs 中的两个方法如下所示:

        public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddControllers();
}

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

app.UseCors(options => options.WithOrigins(Configuration.GetValue<string>("Cors:AllowedSite")).AllowAnyMethod().AllowAnyHeader().AllowCredentials());

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

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

感谢您为我提供的所有答案!我希望这会在将来帮助某人。但我仍然很奇怪将 CORS 与策略一起使用有什么问题。

最佳答案

将您的代码修改为:


app.UseCors("Policy1");

services.AddCors(options =>
{
options.AddPolicy("Policy1",
builder =>
{

.builder.WithOrigins("http://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod();
});
});

并删除

[EnableCors("Policy1")]

来自 Controller 操作。

关于c# - CORS 不适用于 .NET Core API 和 Angular 前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65082452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com