Фильтры ядра .Net в шлюзе API - PullRequest
0 голосов
/ 04 апреля 2019

Я бы хотел включить фильтры в проект Gateway API, который я создал.В этом проекте нет контроллеров (я думаю, это важно отметить).Он работает с рядом микросервисов, служит обратным прокси-сервером и выполняет сквозные задачи, а также оркестровку.Мне нужно применить различные фильтры к запросам в конвейере - в основном, чтобы включить данные заголовка.Я не был в состоянии применить фильтры - точки останова не получают удар и никаких исключений.

У меня есть 3 вопроса:

  • Как заставить работать фильтры?

  • Как передать аргументыфильтры во время разработки?

  • Как передать аргумент фильтрам во время выполнения (зависимости)?См. Пример кода последней строки

STARTUP.CS

public void ConfigureServices(IServiceCollection services)
        {
            var logger = _loggerFactory.CreateLogger<Startup>();
            services.AddCors(options =>
            {
                options.AddPolicy("app-cors-policy",
                    builder =>
                    {
                        builder
                            .AllowAnyOrigin()
                            .AllowAnyHeader()
                            .AllowAnyMethod()
                            .AllowCredentials()
                            .WithExposedHeaders("Content-Disposition") //headers to be exposed
                        ;
                    });
            });

            services.AddMvc(options =>
            {
                options.Filters.Add(new ContentDispositionFilter(?????));
            });
        }

   public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {           
        app.UseCors("app-cors-policy").UseMvc();

        app.Run(async (context) =>
        {
            _router.Request = context.Request;
            var httpResponseMessage = await _router.RouteRequest();

            if (httpResponseMessage.IsSuccessStatusCode)
            {
//
// *** HOW DO I PASS httpResponseMessage TO A FILTER *** ???
//

1 Ответ

1 голос
/ 04 апреля 2019

Ну, вы не можете делать оба одновременно.Не ясно, действительно ли это ваше требование, но если это так, вам не повезло.

Чтобы передать вещи во время проектирования, вы буквально используете конструктор, как и любой другой класс:

options.Filters.Add(new ContentDispositionFilter("foo"));

Который затем будет соответствовать конструктору в этом классе, например:

public ContentDispositionFilter(string myParam)

Чтобы добавить зависимости во время выполнения, вам придется использовать внедрение зависимостей.Проще говоря, вы заставляете конструктор иметь параметры для различных зависимостей:

public ContentDispositionFilter(Dependency1 dep1, Dependency2, dep2)

Затем, чтобы зарегистрировать глобальный фильтр, вы должны будете сделать это с помощью type , а не с ссылкой.То, как вы делаете это в настоящее время по ссылке, где ваш новый это в линию.Вместо этого вам нужно будет сделать:

options.Filters.Add(typeof(ContentDispositionFilter));

И затем, конечно, вам нужно убедиться, что ваш фильтр действительно зарегистрирован в коллекции сервисов:

services.AddScoped<ContentDispositionFilter>();

РЕДАКТИРОВАТЬ

Стоит отметить, что сама регистрация службы дает вам возможность сделать и то, и другое.На самом деле вы можете передать заводскую лямбду следующим образом:

services.AddScoped(p =>
{
    var dep1 = p.GetRequiredService<Dependency1>();
    return new ContentDispositionFilter("foo", dep1);
}

Итак, у вас есть статическая вещь (строка), которую вы передаете в и , получая сервис времени выполнения.Параметр p - это экземпляр IServiceProvider, поэтому вы можете извлечь из него любую понравившуюся вам услугу.

EDIT # 2

Итак, я простозаметил комментарий в конце вашего блока кода:

//
// *** HOW DO I PASS httpResponseMessage TO A FILTER *** ???
//

Просто вы не можете.Не здесь.Я не уверен, чего вы в конечном итоге пытаетесь достичь, но это не способ сделать это.Похоже, это проблема XY .Попробуйте создать новый вопрос, напрямую связанный с тем, что вы на самом деле хотите, вместо решения, которое, как вы думаете, доставит вас туда.

...