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

ASP.NET 6中仅为GET请求启用CORS遇到问题

问题分析与解决:仅允许GET请求的CORS配置无效

这不是Bug,是对ASP.NET Core CORS验证逻辑的误解,原因和解决方法如下:

核心原因

CORS的验证分两种场景:

  • 预检请求(OPTIONS):仅针对非简单请求触发,比如Content-Type为application/json的POST请求、带自定义头的请求等。此时CORS中间件会严格验证请求方法是否在允许列表中。
  • 简单请求:如果你的POST请求满足「Content-Type是application/x-www-form-urlencoded、multipart/form-data或text/plain」,属于简单请求,浏览器不会发送预检,直接发送请求。ASP.NET Core的CORS中间件此时只会验证请求Origin是否合法,不会校验请求方法,所以POST请求会正常返回,前端也不会触发CORS错误。

解决方法

方法1:让POST请求触发预检

在前端发起POST请求时,设置Content-Type为非简单请求的类型(比如application/json),示例:

fetch('/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({})
});

此时浏览器会发送OPTIONS预检请求,CORS中间件会发现POST不在允许的方法列表中,直接拒绝请求,前端就会触发预期的CORS错误。

方法2:手动拦截非GET的跨域请求

如果需要对所有跨域请求严格校验方法,可以在接口中添加逻辑:

app.MapPost("/", (HttpContext context) => {
    var origin = context.Request.Headers.Origin.ToString();
    // 验证Origin是否在允许列表,且请求方法为GET
    if (origin == "https://customsite.com" && context.Request.Method != "GET") {
        context.Response.StatusCode = StatusCodes.Status403Forbidden;
        return "跨域请求仅支持GET方法";
    }
    return "Hello World!";
});

代码优化建议

你代码中调用了两次UseCors,这会导致CORS中间件被重复添加,建议只保留一种配置方式:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCors(options => {
    options.AddPolicy("customPolicy", policy => {
        policy.WithOrigins("https://customsite.com").WithMethods("GET");
    });
});

var app = builder.Build();

// 只保留一个UseCors配置
app.UseCors("customPolicy");

app.MapPost("/", () => "Hello World!");

app.Run();

内容的提问来源于stack exchange,提问作者Yossi Sternlicht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:05:21