翼度科技»论坛 编程开发 .net 查看内容

Ocelot与路由共存

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
Ocelot与路由共存

引言

在Asp.Net Core中使用了Ocelot做网关之后,其自身的Api路由就不起作用了,寻了许久的解决方法,终于找到一个,主要是使用MapWhen判断Ocelot的配置是否符合,是则走转发路由,否则走自身路由,步骤如下:
1.先创建以下类
  1. using Ocelot.Configuration.Repository;
  2. using Ocelot.DownstreamRouteFinder.Finder;
  3. using Ocelot.Middleware;
  4. namespace GateWay.Extensions
  5. {
  6.     public static class OcelotExtensions
  7.     {
  8.         public static IApplicationBuilder UseOcelotWhenRouteMatch(this IApplicationBuilder app)
  9.             => UseOcelotWhenRouteMatch(app, new OcelotPipelineConfiguration());
  10.         public static IApplicationBuilder UseOcelotWhenRouteMatch(this IApplicationBuilder app,
  11.             Action<OcelotPipelineConfiguration> pipelineConfigurationAction)
  12.         {
  13.             var pipelineConfiguration = new OcelotPipelineConfiguration();
  14.             pipelineConfigurationAction?.Invoke(pipelineConfiguration);
  15.             return UseOcelotWhenRouteMatch(app, pipelineConfiguration);
  16.         }
  17.         public static IApplicationBuilder UseOcelotWhenRouteMatch(this IApplicationBuilder app, OcelotPipelineConfiguration configuration)
  18.         {
  19.             app.MapWhen(context =>
  20.             {
  21.                 // 获取 OcelotConfiguration
  22.                 var internalConfigurationResponse =
  23.                     context.RequestServices.GetRequiredService<IInternalConfigurationRepository>().Get();
  24.                 if (internalConfigurationResponse.IsError || internalConfigurationResponse.Data.Routes.Count == 0)
  25.                 {
  26.                     // 如果没有配置路由信息,不符合分支路由的条件,直接退出
  27.                     return false;
  28.                 }
  29.                 var internalConfiguration = internalConfigurationResponse.Data;
  30.                 var downstreamRouteFinder = context.RequestServices
  31.                     .GetRequiredService<IDownstreamRouteProviderFactory>()
  32.                     .Get(internalConfiguration);
  33.                 // 根据请求以及上面获取的Ocelot配置获取下游路由
  34.                 var response = downstreamRouteFinder.Get(context.Request.Path, context.Request.QueryString.ToString(),
  35.                     context.Request.Method, internalConfiguration, context.Request.Host.ToString());
  36.                 // 如果有匹配路由则满足该分支路由的条件,交给 Ocelot 处理
  37.                 return !response.IsError
  38.                        && !string.IsNullOrEmpty(response.Data?.Route?.DownstreamRoute?.FirstOrDefault()
  39.                            ?.DownstreamScheme);
  40.             }, appBuilder => appBuilder.UseOcelot(configuration).Wait());
  41.             return app;
  42.         }
  43.     }
  44. }
复制代码
2.在Program.cs调用
  1. app.UseOcelotWhenRouteMatch(); // 此处调用
  2. app.UseRouting();
  3. app.UseHttpsRedirection();
  4. app.UseAuthentication();
  5. app.UseAuthorization();
复制代码
来源:https://www.cnblogs.com/DriftingLeaf/archive/2023/08/21/17646493.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具