Blazor直连API遭CORS拦截问题求助
我搭建了包含Blazor WebAssembly和API项目的Aspire解决方案:
- API运行地址:
https://localhost:7476 - Blazor(InteractiveServer模式)部署地址:
https://localhost:7077
平时通过MapPost/MapGet注册的API都通过内部SignalR连接调用,运行正常。但用RadzenUpload组件直接调用https://localhost:7476/api/upload上传文件时,浏览器报CORS错误:
Access to XMLHttpRequest at 'https://localhost:7476/api/upload' from origin 'https://localhost:7077' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我已经在API和Blazor的Program.cs中添加了以下CORS配置,但问题依旧:
builder.Services.AddCors(o => o.AddPolicy("AllowAll", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); })); ... var app = builder.Build(); app.UseCors("AllowAll");
1. 调整API项目的CORS中间件顺序
CORS中间件的位置至关重要,必须放在UseRouting之后、UseAuthorization之前,否则OPTIONS预请求会被授权逻辑拦截,无法触发CORS策略。修改API的Program.cs:
var builder = WebApplication.CreateBuilder(args); // 注册CORS策略 builder.Services.AddCors(options => { options.AddPolicy("AllowBlazorUpload", policy => { // 指定Blazor的具体源,避免和AllowCredentials冲突 policy.WithOrigins("https://localhost:7077") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); // 如果上传需要携带身份凭证(如Cookie、JWT) }); }); // 添加控制器服务 builder.Services.AddControllers(); var app = builder.Build(); // 中间件顺序:先路由,再CORS,最后授权 app.UseRouting(); // 启用CORS策略 app.UseCors("AllowBlazorUpload"); app.UseAuthorization(); // 映射API控制器 app.MapControllers(); app.Run();
2. 移除Blazor项目中的CORS配置
Blazor InteractiveServer模式下,客户端是通过SignalR与服务器通信,直接调用API的是浏览器本身,因此Blazor项目不需要配置CORS,只需要在API端配置即可,多余的配置反而可能导致混淆。
3. 验证关键点
- 确保
WithOrigins中的地址与Blazor的实际部署地址完全一致(包括协议、域名、端口) - 如果不需要身份凭证,可以去掉
.AllowCredentials(),此时也可继续使用AllowAnyOrigin()(但指定具体源更安全合规) - 清除浏览器缓存,避免旧的CORS响应缓存影响测试
内容的提问来源于stack exchange,提问作者beekeeper

