Ocelot API网关映射微服务时控制器名称重复问题求助
针对你遇到的Ocelot路由重复、Swagger显示异常的问题,提供以下几种可行的解决方案:
方案一:调整下游路径模板匹配微服务完整路由
直接修改Ocelot路由配置中的下游路径模板,使其完全匹配微服务的实际路由结构。微服务的ProductController路由为api/[controller],即实际接口路径为/api/Product/xxx,因此将下游路径模板从/api/{everything}改为/api/Product/{everything}:
{ "Routes": [ { "UpstreamPathTemplate": "/api/Product/{everything}", "UpstreamHttpMethod": ["Get", "Post", "Put", "Delete"], "DownstreamPathTemplate": "/api/Product/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 6666 } ] } ] }
此配置下,上游请求/api/Product/StoreStock会直接转发到微服务的/api/Product/StoreStock,Swagger聚合时不会出现路径重复。
方案二:修改微服务控制器路由移除重复前缀
调整微服务ProductController的路由特性,移除api前缀,改为[Route("[controller]")],同时将Ocelot的下游路径模板改为/{everything}:
微服务控制器修改
[ApiController] [Route("[controller]")] public class ProductController : ControllerBase { // 接口实现 }
Ocelot路由配置
{ "Routes": [ { "UpstreamPathTemplate": "/api/Product/{everything}", "UpstreamHttpMethod": ["Get", "Post", "Put", "Delete"], "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 6666 } ] } ] }
此时上游请求/api/Product/StoreStock会转发到微服务的/Product/StoreStock,既解决了路径重复问题,也避免了与其他服务的路由冲突。
方案三:使用Ocelot路径重写功能
如果无法修改微服务路由,可通过Ocelot的RewritePath配置调整转发路径,将原本的下游路径重写为微服务实际期望的路径:
{ "Routes": [ { "UpstreamPathTemplate": "/api/Product/{everything}", "UpstreamHttpMethod": ["Get", "Post", "Put", "Delete"], "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": 6666 } ], "RewritePath": "/api/Product/{everything}" } ] }
该配置会将原本要转发到/api/{everything}的请求,重写为/api/Product/{everything},匹配微服务的实际路由,同时保持上游路径的唯一性。
额外注意:Swagger聚合配置
确保Ocelot Swagger的聚合配置正确,为每个服务指定唯一的Key和Url,避免路径拼接混乱:
{ "SwaggerEndPoints": [ { "Key": "ProductService", "Config": [ { "Name": "Product Service", "Url": "http://localhost:6666/swagger/v1/swagger.json" } ] } ] }
内容的提问来源于stack exchange,提问作者Daniel Macedo Crespo

