.net core 访问Ocelot中“DelegatingHandler”内的“DownstreamrRoute”

.net core 访问Ocelot中“DelegatingHandler”内的“DownstreamrRoute”,.net-core,ocelot,.net Core,Ocelot,是否可以访问Ocelot中的DelegatingHandler中的DownstreamrRoute对象?我有一个DelegatingHandler实例,我想根据调用的下游重路由稍微改变它的行为。我可以根据传递到SendAsync()方法的HttpRequestMessage的URL来执行此操作,但如果可能的话,我更喜欢通过下游重路由键来执行此操作 我已经查看了由OcelotBuilder添加的依赖项,看看是否有我可以注入的东西,然后查询当前的重新路由,但这似乎不可能 例如,如果我有一个Deleg

是否可以访问Ocelot中的
DelegatingHandler
中的
DownstreamrRoute
对象?我有一个
DelegatingHandler
实例,我想根据调用的下游重路由稍微改变它的行为。我可以根据传递到
SendAsync()
方法的
HttpRequestMessage
的URL来执行此操作,但如果可能的话,我更喜欢通过下游重路由键来执行此操作

我已经查看了由
OcelotBuilder
添加的依赖项,看看是否有我可以注入的东西,然后查询当前的重新路由,但这似乎不可能

例如,如果我有一个
DelegatingHandler

公共类MyDelegatingHandler:DelegatingHandler
{
受保护的覆盖异步任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{ 
//在这里重新路由?
}
}
和配置(为简洁起见,删除了必填字段)


是否有可能知道我是在调用
FooKey
还是从一个delegatingHandler调用
BarKey
重新路由?

在配置Ocelot时,我通过添加一个
prequerystringbuildermiddle
处理程序来解决这个问题

通过这样做,我可以在HttpContext.Items集合中设置包含reRouteKey的属性。然后,请求中的其他处理器可以获取该信息

例如(无空处理等)


我刚刚找到了一个解决方案,您必须使用
IHttpContextAccessor

MyDelegatingHandler.cs

using Ocelot.Middleware;

public class MyDelegatingHandler : DelegatingHandler
{
    private IHttpContextAccessor _httpContext;
    public MyHandler(IHttpContextAccessor httpContext)
    {
        _httpContext = httpContext;
    }
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var downstreamRoute = _httpContext.HttpContext.Items?.DownstreamRouteHolder()?.Route?.DownstreamRoute?.FirstOrDefault();
        if (downstreamRoute != null)
        {
             if(downstreamRoute.Key == "FooKey")
             {
                  //Do something
             } else if (downstreamRoute.Key == "BarKey")
             {
                  //Do something else
             }
        }
    }
}
使用Ocelot.Middleware;
公共类MyDelegatingHandler:DelegatingHandler
{
私有IHttpContextAccessor_httpContext;
公共MyHandler(IHttpContextAccessor httpContext)
{
_httpContext=httpContext;
}
受保护的覆盖异步任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
var downstreamRoute=_httpContext.httpContext.Items?.DownstreamRouteHolder()?.Route?.downstreamRoute?.FirstOrDefault();
if(下游路线!=null)
{
if(downstreamRoute.Key==“FooKey”)
{
//做点什么
}else if(下游路线.键==“BarKey”)
{
//做点别的
}
}
}
}
您还需要注册
services.AddHttpContextAccessor()
on
Startup.cs

using Ocelot.Middleware;

public class MyDelegatingHandler : DelegatingHandler
{
    private IHttpContextAccessor _httpContext;
    public MyHandler(IHttpContextAccessor httpContext)
    {
        _httpContext = httpContext;
    }
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var downstreamRoute = _httpContext.HttpContext.Items?.DownstreamRouteHolder()?.Route?.DownstreamRoute?.FirstOrDefault();
        if (downstreamRoute != null)
        {
             if(downstreamRoute.Key == "FooKey")
             {
                  //Do something
             } else if (downstreamRoute.Key == "BarKey")
             {
                  //Do something else
             }
        }
    }
}
NB:具体来说,我的配置是“路由”,而不是“重路由”。我相信它也会适用于“重路由”配置

using Ocelot.Middleware;

public class MyDelegatingHandler : DelegatingHandler
{
    private IHttpContextAccessor _httpContext;
    public MyHandler(IHttpContextAccessor httpContext)
    {
        _httpContext = httpContext;
    }
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var downstreamRoute = _httpContext.HttpContext.Items?.DownstreamRouteHolder()?.Route?.DownstreamRoute?.FirstOrDefault();
        if (downstreamRoute != null)
        {
             if(downstreamRoute.Key == "FooKey")
             {
                  //Do something
             } else if (downstreamRoute.Key == "BarKey")
             {
                  //Do something else
             }
        }
    }
}