.NET 8 Blazor WASM部署Ubuntu后CORS请求失败求助
解决Blazor WASM部署到Ubuntu后CORS请求失败问题
针对你遇到的跨源请求被阻止、服务端无日志的问题,按以下步骤排查解决:
1. 检查.NET中间件顺序是否正确
CORS中间件的位置直接决定策略是否生效,必须放在UseRouting之后、UseAuthorization/UseEndpoints之前。调整Program.cs的中间件管道:
app.UseRouting(); app.UseCors("AllowAll"); // 关键:位置不能错 app.UseAuthorization(); app.MapControllers();
2. 确认API服务是否监听外部请求
本地运行时dotnet run默认绑定localhost,但Ubuntu服务器上需要让API监听所有网卡,否则外部客户端浏览器无法访问:
- 启动API时指定绑定地址:
dotnet Server.dll --urls=http://0.0.0.0:5000 - 或者在Program.cs中固化配置:
builder.WebHost.UseUrls("http://0.0.0.0:5000");
如果API只绑定localhost,浏览器的OPTIONS请求根本无法到达服务端,就会出现你看到的状态码null的错误。
3. 启用CORS日志排查请求是否到达服务端
修改API的appsettings.json,开启CORS相关调试日志,确认请求是否被服务端接收:
"Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", "Microsoft.AspNetCore.Cors": "Debug" } }
重启服务后测试,查看日志中是否有CORS策略的执行记录。如果还是没有日志,说明请求没到达API,回到步骤2确认绑定地址。
4. 改用Nginx反向代理彻底避免跨域
既然前端用Nginx托管,最佳实践是通过反向代理将API请求转发到后端,让前端和API同源,彻底消除CORS问题:
修改Nginx配置,新增API代理规则:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html; server_name _; location / { root /var/www/html; try_files $uri $uri/ /index.html; } # 新增API反向代理 location /api { proxy_pass http://localhost:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /_framework { root /var/www/html; } location /css { root /var/www/html; } location /js { root /var/www/html; } }
然后修改Blazor客户端的HttpClient配置,使用相对路径:
// 空字符串表示和前端同源,直接用/api开头的相对路径 builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri("") });
重启Nginx后测试,跨域问题会直接消失。
5. 排除浏览器缓存干扰
Firefox可能缓存了之前的跨域错误状态,尝试用隐私窗口测试,或者清除浏览器缓存(Ctrl+Shift+Delete)后再验证。
内容的提问来源于stack exchange,提问作者r-kane
相关产品推荐
相关产品推荐

