.NET Core 6.0 CORS跨域报错求助:文件上传成功但无允许源头
解决ASP.NET Core 6跨域文件上传问题
你的问题核心是接收请求的用户端项目未配置CORS策略——虽然文件已成功保存,但服务端未返回跨域允许的响应头,导致浏览器拦截了请求结果,抛出CORS错误。以下是具体修复步骤:
步骤1:在用户端Program.cs中添加CORS服务配置
在builder.Services.AddControllersWithViews();代码之前,添加CORS策略,明确允许CMS项目的域名发起跨域请求:
// 配置CORS策略 builder.Services.AddCors(options => { options.AddPolicy("AllowCMSOrigin", policy => { // 指定允许跨域的CMS域名 policy.WithOrigins("https://localhost:7056") // 允许所有请求方法(适配文件上传的POST请求) .AllowAnyMethod() // 允许所有请求头(适配FormData格式的文件上传) .AllowAnyHeader(); // 如果请求需要携带Cookie/身份令牌,取消注释下面一行 // .AllowCredentials(); }); }); builder.Services.AddControllersWithViews();
步骤2:在请求管道中启用CORS中间件
在app.UseRouting();之后、app.UseAuthentication();之前,添加启用CORS的代码,确保中间件顺序正确:
app.UseRouting(); // 启用CORS,使用上面定义的策略 app.UseCors("AllowCMSOrigin"); app.UseAuthentication(); app.UseAuthorization();
修改后的完整用户端Program.cs示例
var builder = WebApplication.CreateBuilder(args); // Add services to the container. var connectionString = Constants.DefaultConnectionString; builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString)); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); // 新增:配置CORS策略 builder.Services.AddCors(options => { options.AddPolicy("AllowCMSOrigin", policy => { policy.WithOrigins("https://localhost:7056") .AllowAnyMethod() .AllowAnyHeader(); }); }); builder.Services.AddControllersWithViews(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 新增:启用CORS中间件 app.UseCors("AllowCMSOrigin"); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.Run();
额外注意事项
- 生产环境适配:部署到生产环境时,不要使用
AllowAnyOrigin,需替换为CMS项目的实际生产域名(例如https://your-cms-domain.com)。 - 凭据支持:如果请求需要携带Cookie或身份令牌,需在CORS策略中添加
.AllowCredentials(),同时前端Ajax要补充配置xhrFields: { withCredentials: true }。 - 中间件顺序:CORS中间件必须放在
UseRouting之后、UseAuthentication/UseAuthorization之前,否则策略不会生效。
内容的提问来源于stack exchange,提问作者Hanzi
相关产品推荐
相关产品推荐

