ASP.NET Core 2.2下载Excel文件触发CORS跨域拦截问题求解
错误原因
- 跨域白名单不匹配:你配置文件中仅允许
http://localhost:4200发起跨域请求,但本次请求的Origin为https://pno.mydataz.com:7071,不在允许列表内,CORS校验直接失败。 - CORS策略配置错误:你在
Configure方法中重复调用了两次UseCors,第一次引用的命名策略CorsPolicy并未在ConfigureServices中定义,第二次写的内联策略不会生效,相当于CORS配置未正常启用。 - 中间件顺序错误:ASP.NET Core 2.2要求
UseCors必须放在UseRouting之后、UseAuthentication之前,顺序错误会导致响应头无法正常附加CORS相关字段。 - 未允许带凭证的跨域请求:你的请求携带了
Authorization身份凭证头,但CORS配置中未开启AllowCredentials(),这类请求会被默认拦截。 - 额外问题:下载接口返回的Content-Type为
text/plain,不符合Excel文件的标准MIME类型,会导致前端下载后文件无法正常打开。
解决方法
- 首先在
Startup.cs的ConfigureServices方法中正确注册命名CORS策略:
public void ConfigureServices(IServiceCollection services) { services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => { // 把所有需要允许的前端Origin都加入白名单 builder.WithOrigins("http://localhost:4200", "https://pno.mydataz.com:7071") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 必须添加,适配带Authorization头的请求 }); }); // 其他服务注册逻辑保持不变 }
- 修正
Configure方法中的中间件顺序,删除重复的UseCors调用:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 最先放路由中间件 app.UseRouting(); // 紧接着放CORS中间件,必须在认证中间件之前 app.UseCors("CorsPolicy"); // 再放认证、授权中间件 app.UseAuthentication(); // 其他中间件、端点配置保持不变 }
- 修正下载接口的返回MIME类型,避免文件损坏:
[HttpGet] [Route("Download")] public IActionResult Download(string filename) { if (string.IsNullOrEmpty(filename)) return Content("filename not present"); var path = Path.Combine(GetFilesDownload, filename); if (!System.IO.File.Exists(path)) return NotFound("请求的文件不存在"); var memory = new MemoryStream(); using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { stream.CopyTo(memory); } memory.Position = 0; // 替换为Excel文件的标准MIME类型 return File(memory, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", Path.GetFileName(path)); }
- 测试环境临时调试方案:如果需要临时允许所有跨域源调试,可以把
WithOrigins(...)替换为SetIsOriginAllowed(_ => true),生产环境请务必关闭该配置,严格控制跨域白名单。
内容的提问来源于stack exchange,提问作者ahmed barbary
相关产品推荐
相关产品推荐

