Доступ к `DownstreamReRoute` в` DelegatingHandler` в Ocelot - PullRequest
0 голосов
/ 15 октября 2019

Возможно ли получить доступ к объекту DownstreamReRoute в пределах DelegatingHandler в Ocelot? У меня есть экземпляр DelegatingHandler, и я хотел бы немного изменить его поведение в зависимости от вызываемого обратного маршрута. Я мог бы сделать это на основе URL-адреса HttpRequestMessage, который передается в метод SendAsync(), но я бы предпочел сделать это с помощью ключа перенаправления вниз по потоку, если это возможно.

Я посмотрел на зависимости, добавленные 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?

1 Ответ

0 голосов
/ 15 ноября 2019

Мне удалось решить эту проблему, добавив обработчик PreQueryStringBuilderMiddleware при настройке Ocelot.

Делая это, я мог установить свойство в коллекции HttpContext.Items, которая содержит reRouteKey. Это может затем быть обработано другими процессорами в запросе.

Например (без обработки нуля и т. Д.)

app.UseOcelot(cfg =>
  cfg.PreQueryStringBuilderMiddleware = (ctx, next) => {
    ctx.HttpContext.Items["ReRouteKey"] = ctx.DownstreamReRoute.Key;
    return next.Invoke();
});
...