在Ocelot中可以访问DownstreamReRoute对象在DelegatingHandler中吗?我有一个DelegatingHandler实例,我想根据正在调用的下游重路由稍微改变它的行为。我可以根据传递给HttpRequestMessage方法的SendAsync()的URL来完成这个任务,但如果可能的话,我更愿意通过下游的重路由键来完成。
我查看了OcelotBuilder添加的依赖项,看看是否有什么东西可以注入,然后查询当前的重路由,但这似乎是不可能的。
如果我有一个DelegatingHandler
public class MyDelegatingHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// access reRoute here?
}
}和config (为简洁起见需要移除的字段)
"ReRoutes": [
{
"DownstreamPathTemplate": "/downstream/foo",
"UpstreamPathTemplate": "/foo",
"Key": "FooKey",
"DelegatingHandlers": [ "MyDelegatingHandler" ]
},
{
"DownstreamPathTemplate": "/downstream/bar",
"UpstreamPathTemplate": "/bar",
"Key": "BarKey",
"DelegatingHandlers": [ "MyDelegatingHandler" ]
}]是否可能知道我是从一个FooKey调用BarKey reRoute还是从delegatingHandler调用delegatingHandler?
发布于 2019-11-15 13:38:17
我在配置Ocelot时添加了一个PreQueryStringBuilderMiddleware处理程序,从而解决了这个问题。
通过这样做,我可以在HttpContext.Items集合中设置一个包含reRouteKey的属性。然后,可以由请求中的其他处理器来获取这一点。
例如(没有空处理等)
app.UseOcelot(cfg =>
cfg.PreQueryStringBuilderMiddleware = (ctx, next) => {
ctx.HttpContext.Items["ReRouteKey"] = ctx.DownstreamReRoute.Key;
return next.Invoke();
});发布于 2020-10-08 10:10:13
我刚刚找到了一个解决方案,您必须使用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
}
}
}
}您还需要在services.AddHttpContextAccessor();上注册Startup.cs
NB__:具体来说,我的配置是“路由”,而不是"ReRoutes“。我相信它也适用于"ReRoutes“配置。
https://stackoverflow.com/questions/58398047
复制相似问题