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

.NET Core 3.1与2.1 Web API跨域(CORS)迁移遇405错误求助

解决.NET Core 3.1迁移中CORS导致的405方法不允许错误

我之前把API迁移到.NET Core 3.1时也踩过一模一样的坑!问题核心在于中间件的执行顺序——.NET Core 3.0引入的端点路由(Endpoint Routing)彻底改变了请求处理流程,你的CORS中间件位置放错了,导致预检请求(OPTIONS)被拦截,最终返回405错误。

问题根源

在你的3.1代码里,app.UseCors("AllowAnyOrigin")放在了app.UseRouting()之前,但在端点路由模型中,CORS中间件需要先知道请求匹配到哪个端点,才能正确应用对应的CORS策略。顺序不对的话,OPTIONS预检请求会被路由系统判定为“方法不允许”,直接返回405。

具体解决方案

只需要调整中间件顺序,同时可以清理一些冗余代码:

1. 优化ConfigureServices方法

public void ConfigureServices(IServiceCollection services)
{
    // 3.1+版本开发RESTful API优先用AddControllers,它只包含API核心服务
    services.AddControllers();
    
    services.AddCors(options => 
    {
        options.AddPolicy("AllowAnyOrigin", builder => builder
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader());
    });
    
    // 如果你的API不需要MVC视图功能,建议删除下面这行冗余代码
    // services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
}

2. 调整Configure方法的中间件执行顺序

关键是把UseCors放在UseRouting之后、UseAuthorization之前:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    
    // 先启用路由匹配逻辑
    app.UseRouting();
    
    // CORS必须在路由之后、授权之前启用,才能正确处理预检请求
    app.UseCors("AllowAnyOrigin");
    
    app.UseAuthorization();
    
    app.UseEndpoints(endpoints => 
    {
        endpoints.MapControllers();
    });
}

额外注意事项

  • 生产环境强烈建议不要用AllowAnyOrigin,可以换成WithOrigins("https://your-frontend-domain.com")指定允许的前端域名,避免跨域安全风险。
  • 自定义中间件也要遵循通用顺序:异常处理 → HTTPS重定向 → 路由 → CORS → 授权 → 端点映射,顺序错了很容易引发各种奇怪的请求拦截问题。

内容的提问来源于stack exchange,提问作者A. B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:09:15