替换app.MapControllers为UseEndpoints后ASP.NET Core Web API的CORS问题
解决非托管Blazor WASM与使用UseEndpoints的ASP.NET Core API的CORS问题
问题根源
替换app.MapControllers()为app.UseEndpoints(...)后CORS失效,核心原因是中间件顺序错误,或是未确保CORS策略被绑定到路由端点上。在.NET 6的极简模式中,MapControllers()会自动处理路由与中间件的关联,但手动使用UseEndpoints时需要严格遵循中间件执行顺序。
解决方案
1. 确保CORS中间件的正确顺序
在Program.cs中,UseCors必须放在UseRouting之后、UseEndpoints之前,且在UseAuthorization等认证中间件之前。示例配置如下:
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务 builder.Services.AddControllers(); // 配置CORS策略 builder.Services.AddCors(options => { options.AddPolicy("AllowBlazorOrigin", policy => policy.WithOrigins("https://localhost:7041") .AllowAnyMethod() .AllowAnyHeader()); }); var app = builder.Build(); app.UseHttpsRedirection(); // 必须先启用路由匹配 app.UseRouting(); // 启用CORS,应用指定策略 app.UseCors("AllowBlazorOrigin"); // 认证/授权中间件(如果有) app.UseAuthorization(); // 配置端点路由 app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); }); app.Run();
2. (可选)针对端点显式绑定CORS策略
如果需要更精细的控制,可以直接在路由端点上绑定CORS策略,确保该端点强制应用规则:
app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute() .RequireCors("AllowBlazorOrigin"); // 显式要求使用指定CORS策略 });
补充说明
- 托管模式下无CORS问题的原因:Blazor WASM与API共享同一主机进程,请求属于同源请求,浏览器不会触发CORS校验。
- 验证CORS策略是否生效:可以通过浏览器开发者工具的网络面板查看请求响应头,确认
Access-Control-Allow-Origin是否包含https://localhost:7041。
内容的提问来源于stack exchange,提问作者GoupilSystem
相关产品推荐
相关产品推荐

