.NET 6 集成 Ocelot 18 部署至 IIS 后访问网关URL返回404
.NET 6 + Ocelot 18 IIS部署404问题解决指南
问题根源
IIS作为反向代理时,Ocelot默认会从应用内部上下文读取端口,而这个端口和网关对外暴露的端口不一致,导致转发URL错误拼接了内部端口。另外,.NET 6默认未配置ForwardedHeaders,Ocelot无法识别真实的外部请求地址,进一步加剧了这个问题。
修复步骤
1. 给网关添加ForwardedHeaders配置
在Program.cs中先配置转发头,让应用能正确获取IIS传递的真实请求信息,注意要放在Ocelot中间件之前:
var builder = WebApplication.CreateBuilder(args); // 配置转发头,识别IIS传递的真实地址 builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedHost; options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); }); // 注册Ocelot服务 builder.Services.AddOcelot(); var app = builder.Build(); // 先启用转发头 app.UseForwardedHeaders(); // 再启用Ocelot await app.UseOcelot(); app.Run();
2. 修正Ocelot配置文件
打开ocelot.json,确保下游服务的配置指向Player微服务的真实IIS地址,不要随意添加端口:
{ "Routes": [ { "UpstreamPathTemplate": "/player/{everything}", "UpstreamHttpMethod": ["Get", "Post"], "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "你的Player微服务域名/机器名", "Port": 80 // 使用默认80端口的话,直接删除这个字段也可以 } ] } ], "GlobalConfiguration": { "BaseUrl": "http://你的网关对外访问域名/机器名" // 填写网关真实对外地址,不要加端口 } }
3. 检查IIS的关键配置
- 确认网关和Player微服务的IIS站点绑定的域名/IP、端口正确,比如默认用80端口就不要随意修改。
- 开启IIS的**ARR(Application Request Routing)**模块,没有这个模块的话,网关无法转发请求到其他站点。
- 检查站点的URL重写规则,避免有冲突的规则篡改请求路径。
4. 日志排查定位
在appsettings.json中把日志级别设为Debug,查看Ocelot的转发日志:
{ "Logging": { "LogLevel": { "Default": "Debug", "Ocelot": "Debug" } } }
启动服务后查看日志里的DownstreamUrl是否正确,如果仍带错误端口,再核对GlobalConfiguration里的BaseUrl是否和网关对外访问地址完全一致。
内容的提问来源于stack exchange,提问作者Omar Maurera
相关产品推荐
相关产品推荐

