.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
相关产品推荐
相关产品推荐

