如何在独立项目中统一配置ASP.NET Core 6的CORS以避免重复代码?
封装ASP.NET Core 6 CORS配置以避免重复代码
核心答案
完全可以将CORS的两步配置封装到独立类库中,只需在各API项目的启动逻辑中调用两个扩展方法即可完成统一配置——这是解决多项目重复CORS配置的最佳实践之一。
为什么需要两个方法?
ASP.NET Core的启动流程分为**服务注册(ConfigureServices阶段)和请求管道构建(Configure阶段)**两个独立环节:
AddCors用于注册CORS策略到服务容器,属于服务注册阶段UseCors用于将CORS中间件加入请求管道,属于管道构建阶段
这两步无法合并为单个方法,但通过扩展方法封装后,每个API项目只需调用两次,无需重复编写具体的CORS规则。
优化后的封装代码
你的代码已经实现了核心功能,这里做一些细节优化(比如使用环境变量判断开发环境、将常量设为私有只读):
using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; namespace Company.CorsTool; public static class ServiceExtension { private const string AllowSpecificOriginsName = "AllowCors"; private static readonly string[] _allowedDomainProd = new[] { "http://example.com" }; private static readonly string[] _allowedDomainDebug = new[] { "https://prodexample.com" }; public static void AddCompanyCors(this IServiceCollection services, IWebHostEnvironment env) { var allowedOrigins = env.IsDevelopment() ? _allowedDomainDebug.Concat(_allowedDomainProd).ToArray() : _allowedDomainProd; services.AddCors(options => options.AddPolicy(AllowSpecificOriginsName, builder => { builder.WithOrigins(allowedOrigins) .AllowCredentials() .AllowAnyHeader() .AllowAnyMethod(); }) ); } public static void UseCompanyCors(this IApplicationBuilder app) { app.UseCors(AllowSpecificOriginsName); } }
在API项目中使用的方式
- 在各API项目中引用
Company.CorsTool类库 - 在
Program.cs(ASP.NET Core 6+采用顶级语句)中调用:
var builder = WebApplication.CreateBuilder(args); // 注册CORS服务 builder.Services.AddCompanyCors(builder.Environment); // ... 其他服务注册 var app = builder.Build(); // 启用CORS中间件(注意顺序:要放在路由之前、静态文件之后,如果有静态文件的话) app.UseCompanyCors(); // ... 其他中间件配置 app.MapControllers(); app.Run();
关键注意事项
- 中间件顺序:
UseCompanyCors必须放在MapControllers之前,且在UseRouting之后(如果显式使用的话),否则CORS规则不会生效 - 环境判断:使用
IWebHostEnvironment判断环境比手动传参更可靠,能自动读取项目的环境变量配置 - 策略名称一致性:确保
AddCompanyCors中注册的策略名称和UseCompanyCors中使用的名称完全一致,否则中间件找不到对应的策略
内容的提问来源于stack exchange,提问作者Jeffrey
相关产品推荐
相关产品推荐

