我最近将一个相对较大的 Web API 从 .NET Core 3.1 升级到 .NET 6,并收到 no Access-Control-Allow-Origin header CORS 错误。我还没有转向最小托管模型,但我从文档中了解到这是没有必要的,旧模型应该继续工作。我在下面包含了启动和程序中的代码以及我必须更改的内容才能使升级后的项目正常工作。请注意,其他一切都正常。
启动.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
services.AddCors(options => options.AddPolicy("CorsPolicy",
builder =>
{
builder.AllowAnyMethod()
.WithOrigins(Configuration.GetSection("AllowedOrigins").Get<string[]>())
.SetIsOriginAllowed(origin => true)
.AllowAnyHeader();
}));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory, IHostApplicationLifetime appLifetime)
{
app.UseCors("CorsPolicy");
}
请注意,
*
是从“AllowedOrigins”返回的。
程序.cs
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls(Configuration.GetValue<bool>("App:UsesHttps")
? $"{Configuration.GetValue<string>("App:HttpUrl")}, " +
$"{Configuration.GetValue<string>("App:HttpsUrl") }"
: $"{Configuration.GetValue<string>("App:HttpUrl")}")
.UseStartup<Startup>();
});
对于升级到 .NET 6,
Startup.cs
中没有任何更改。在 Program.cs
中,.UseUrls
不再起作用,而是我在应用程序设置中定义了它,并且删除了对 .UseUrls
的调用。
应用程序设置(.NET Core 3.1)
"App": {
"UsesHttps": false,
"HttpUrl": "http://0.0.0.0:5005",
"HttpsUrl": "https://0.0.0.0:5001"
},
应用程序设置 (.NET 6)
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5005"
}
}
},
代码中的其他内容没有改变,我所做的只是更新包。我不明白它们会如何影响 CORS 错误。
该应用程序在 Nginx 后面的 Docker 容器中运行,充当反向代理。我没有对 Nginx 设置进行任何更改。该应用程序仅在 Nginx 处理 HTTPS 连接时侦听 HTTP。同样,当应用程序是针对 .NET Core 3.1 构建时,这才有效。我已阅读有关升级到 .NET 6 的文档,但找不到任何可以解释此类更改的内容。
不知道这对你是否有帮助。我们在program.cs中的API中有以下内容
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other code left out here
app.UseAuthentication();
// Allow CORS for any origin, method or header
app.UseCors(policy =>
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseAuthorization();
}
如果我没记错的话,事情的顺序非常重要。我在您的代码中没有看到身份验证和授权。不知道你是否需要那个。这段代码有一个注释,因为它可能允许太多。我们还需要调查一下。
该解决方案对我不起作用:(仍然出现 cors 错误“从源“http://localhost”访问“http://localhost:8081/PrinterTag”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应不未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。”所有地址、所有标头、身份验证和授权均已启用。我不知道该怎么办...如果有人有线索我会很感激