首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ocelot的“`DelegatingHandler`”中访问“下行”

在Ocelot的“`DelegatingHandler`”中访问“下行”
EN

Stack Overflow用户
提问于 2019-10-15 15:23:04
回答 2查看 2K关注 0票数 1

在Ocelot中可以访问DownstreamReRoute对象在DelegatingHandler中吗?我有一个DelegatingHandler实例,我想根据正在调用的下游重路由稍微改变它的行为。我可以根据传递给HttpRequestMessage方法的SendAsync()的URL来完成这个任务,但如果可能的话,我更愿意通过下游的重路由键来完成。

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

如果我有一个DelegatingHandler

代码语言:javascript
复制
public class MyDelegatingHandler : DelegatingHandler
{
  protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  { 
    // access reRoute here?
  }
}

和config (为简洁起见需要移除的字段)

代码语言:javascript
复制
"ReRoutes": [
{
  "DownstreamPathTemplate": "/downstream/foo",
  "UpstreamPathTemplate": "/foo",
  "Key": "FooKey",
  "DelegatingHandlers": [ "MyDelegatingHandler" ]
},
{
  "DownstreamPathTemplate": "/downstream/bar",
  "UpstreamPathTemplate": "/bar",
  "Key": "BarKey",
  "DelegatingHandlers": [ "MyDelegatingHandler" ]
}]

是否可能知道我是从一个FooKey调用BarKey reRoute还是从delegatingHandler调用delegatingHandler?

EN

回答 2

Stack Overflow用户

发布于 2019-11-15 13:38:17

我在配置Ocelot时添加了一个PreQueryStringBuilderMiddleware处理程序,从而解决了这个问题。

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

例如(没有空处理等)

代码语言:javascript
复制
app.UseOcelot(cfg =>
  cfg.PreQueryStringBuilderMiddleware = (ctx, next) => {
    ctx.HttpContext.Items["ReRouteKey"] = ctx.DownstreamReRoute.Key;
    return next.Invoke();
});
票数 1
EN

Stack Overflow用户

发布于 2020-10-08 10:10:13

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

MyDelegatingHandler.cs

代码语言:javascript
复制
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“配置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58398047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档