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

.NET Web API中Swagger启用CORS后仍报错的问题

问题描述

我有一个.NET Web API应用,Program.cs代码如下:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    });
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseCors();

app.MapGet("/", (HttpContext context) =>
{
    context.Response.Redirect("https://www.google.com");
});

app.Run();

直接调用API可以正常重定向,但通过Swagger调用时会返回CORS错误。我已经配置了CORS但未生效,尝试将API移至控制器并使用[EnableCors]属性后问题仍存在。

解决方案

问题核心在于中间件注册顺序错误,以及重定向场景下的同源策略限制,你可以按以下步骤修复:

  1. 调整中间件顺序,将UseCors前置
    CORS中间件需要在所有处理请求的中间件(包括SwaggerUI、路由映射)之前注册,这样才能拦截并处理浏览器发送的OPTIONS预检请求。修改后的中间件序列如下:
var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
}

// 先注册CORS中间件,确保优先处理跨域请求
app.UseCors();

app.UseHttpsRedirection();

if (app.Environment.IsDevelopment())
{
    app.UseSwaggerUI();
}

app.MapGet("/", (HttpContext context) =>
{
    context.Response.Redirect("https://www.google.com");
});

app.Run();
  1. 处理重定向场景的跨域限制
    当API返回302重定向时,浏览器会因SwaggerUI域名(通常是localhost端口)与目标域名(google.com)不同触发同源策略检查。如果需要在Swagger中测试该接口,可修改API逻辑,返回重定向URL让前端自行跳转,而非直接返回重定向响应:
app.MapGet("/", () => Results.Ok(new { RedirectUrl = "https://www.google.com" }));
  1. 可选:为SwaggerUI配置专属CORS策略
    如果调整顺序后仍有问题,可以针对SwaggerUI的来源单独配置CORS规则,避免全局AllowAnyOrigin的宽松配置:
builder.Services.AddCors(options =>
{
    options.AddPolicy("SwaggerPolicy", builder =>
    {
        builder.WithOrigins("https://localhost:5001", "http://localhost:5000") // 替换为你的Swagger实际访问地址
               .AllowAnyMethod()
               .AllowAnyHeader();
    });
    options.AddDefaultPolicy(builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    });
});

然后在中间件中指定使用该策略:

app.UseCors("SwaggerPolicy");

内容的提问来源于stack exchange,提问作者Behzad Dara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:52:13