You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在独立项目中统一配置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项目中使用的方式

  1. 在各API项目中引用Company.CorsTool类库
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:20:43