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

.NET 6.0配置Ocelot网关重定向至同应用控制器的404问题排查

.NET 6 + Ocelot 18.0.0 404问题解决

环境与问题

目标框架:.NET 6.0,Ocelot版本:18.0.0

现有代码如下:

Program.cs

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

var ocelotConfig = builder.Configuration.AddJsonFile(Path.Combine(builder.Environment.ContentRootPath, "ocelot.json"), optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);
builder.Services.AddControllers();

var app = builder.Build();

app.UseOcelot();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();

ocelot.json

{
  "GlobalConfiguration": {
    "BaseAddress": "https://localhost:7249"
  },
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/WeatherForecast",
      "DownstreamScheme": "https",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 7249
        }
      ],
      "UpstreamPathTemplate": "/gtw/WeatherForecast",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ]
}

WeatherForecastController.cs

using Microsoft.AspNetCore.Mvc;

namespace DemoApiGateway.Controllers;

[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

调用https://localhost:7249/gtw/WeatherForecast或直接调用https://localhost:7249/api/WeatherForecast均返回HTTP 404错误,此前在.NET Core 2.2版本中可正常运行。


解决步骤

1. 修复Ocelot中间件的异步调用

Ocelot 18.x在.NET 6+环境中,UseOcelot()是异步方法,必须使用await等待初始化完成,否则网关路由无法正确加载。

2. 调整中间件顺序

中间件执行顺序直接影响请求处理逻辑,正确顺序应为:

  • 先处理HTTPS重定向
  • 再处理授权逻辑
  • 启动Ocelot网关中间件
  • 最后映射本地控制器路由

这样既保证网关能处理转发请求,也能让本地API路由正常生效。

3. 简化Ocelot配置加载方式

无需手动拼接路径,builder.Configuration默认会从项目根目录读取配置文件,可简化代码。


修正后的代码

Program.cs

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

// 简化配置文件加载
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);
builder.Services.AddControllers();

var app = builder.Build();

// 调整中间件顺序并异步启动Ocelot
app.UseHttpsRedirection();
app.UseAuthorization();
await app.UseOcelotAsync();
app.MapControllers();

app.Run();

验证

修改后重新启动项目:

  • 直接访问https://localhost:7249/api/WeatherForecast,应正常返回天气数据
  • 访问网关路径https://localhost:7249/gtw/WeatherForecast,Ocelot会转发请求到本地API,同样返回数据

内容的提问来源于stack exchange,提问作者Vladimer Bagoshvili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:01:05