如何在ASP.NET Core中仅为部分请求添加CORS?
在ASP.NET Core中为部分请求配置CORS
我来帮你梳理下正确的实现方式,你的现有代码里有个关键小问题需要调整,咱们一步步来:
1. 先在ConfigureServices中定义CORS策略
首先得注册CORS服务并定义好你的策略,比如你提到的ApiCorsPolicy:
public void ConfigureServices(IServiceCollection services) { // 配置CORS策略 services.AddCors(options => { options.AddPolicy("ApiCorsPolicy", policy => { // 替换成你实际允许的源,生产环境不建议直接用AllowAnyOrigin() policy.WithOrigins("https://your-frontend-domain.com") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 如果需要携带Cookie/认证信息就加上这个 }); }); // 注册Mvc服务(如果是.NET Core 3.0+也可以用AddControllers) services.AddMvc(); }
2. 在Configure方法中用MapWhen创建请求分支
这里要注意:MapWhen创建的分支管道,所有中间件都要通过innerApp(分支的IApplicationBuilder实例)来添加,你原来代码里在分支里调用app.UseMvc()是错误的,这会把Mvc加到主管道而非分支管道。正确写法如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 开发环境异常页要放在最前面 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 针对特定Host的请求启用CORS app.MapWhen(ctx => ctx.Request.Host.Host == "api.example.com", innerApp => { // 顺序很重要:先启用CORS,再添加Mvc innerApp.UseCors("ApiCorsPolicy"); innerApp.UseMvc(); }); // 主管道的其他请求配置(比如非api.example.com的请求) app.UseMvc(); }
3. 其他常见的匹配条件示例
如果你需要根据路径、请求头等其他条件匹配请求,也可以灵活调整MapWhen的判断逻辑:
- 匹配所有以
/api开头的请求:
app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments("/api"), innerApp => { innerApp.UseCors("ApiCorsPolicy"); innerApp.UseMvc(); });
- 匹配包含特定请求头的请求:
app.MapWhen(ctx => ctx.Request.Headers.ContainsKey("X-Use-Cors"), innerApp => { innerApp.UseCors("ApiCorsPolicy"); innerApp.UseMvc(); });
关键注意事项
- 中间件顺序:
UseCors必须放在UseMvc之前,否则CORS响应头不会被正确注入到请求中。 - 分支管道是独立的:MapWhen里的中间件只对匹配的请求生效,主管道的中间件(除了MapWhen之前的)不会影响分支请求。
- 避免重复配置:如果主管道和分支管道都有
UseMvc,要确保路由配置不会冲突,或者根据需求只在对应管道添加Mvc。
内容的提问来源于stack exchange,提问作者Poul K. Sørensen
相关产品推荐
相关产品推荐

