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