API-шлюз Ocelot не перенаправляет

Создавая микро-сервисную архитектуру с Ocelot, я начал создавать тестовый сервис в отдельном решении. Все работает, и я могу получить ложный ответ на https://localhost:5101/service/stats/collected,

Затем в другом решении я делаю новый новый проект webapi. Затем я слежу за началом работы на официальном сайте Ocelot.

Настройка файла.json для использования его в качестве GW Я получил 500 от проекта, если я попытаюсь нажать https://localhost:5001/api/stats/collected и я не могу понять, почему?

Вот основные файлы для APIGW:

ocelot.json

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/service/stats/collected",
      "DownstreamScheme": "https",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5101
        }
      ],
      "UpstreamPathTemplate": "/api/stats/collected"
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "https://localhost:5001"
  }
}

Program.cs

using System.IO;
using System.Net;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Ocelot.DependencyInjection;
using Ocelot.Middleware;

namespace APIGateway.Base
{
    public class Program
    {
        public static void Main(string[] args)
        {
            new WebHostBuilder()
                .UseKestrel(
                    options =>
                {
                    options.Listen(IPAddress.Loopback, 5001, listenOptions =>
                    {
                        listenOptions.UseHttps("localhost.pfx", "qwerty123");
                    });
                    options.AddServerHeader = false;
                }
                    )
                .UseContentRoot(Directory.GetCurrentDirectory())
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config
                        .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                        .AddJsonFile("appsettings.json", true, true)
                        .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
                        .AddJsonFile("ocelot.json")
                        .AddEnvironmentVariables();
                })
                .ConfigureServices(s => {
                    s.AddOcelot();
                })
                .ConfigureLogging((hostingContext, logging) =>
                {
                    //add your logging
                })
                .UseIISIntegration()
                .Configure(app =>
                {
                    app.UseOcelot().Wait();
                })
                .Build()
                .Run();
        }
    }
}

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace StatsService.Base
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }
}

ОБНОВИТЬ:

Я узнаю, что отключение SSL для каждого проекта, комментируя options в методе UseKestrel сделать мой GW работает. Как я могу настроить это, чтобы иметь безопасную связь между моим GW и Сервисом? Localhost и Прод?

3 ответа

Поскольку вы используете "localhost" в качестве имени хоста, я предполагаю, что вы используете самоподписанный сертификат для localhost. В этом случае вам, возможно, придется добавить

"DangerousAcceptAnyServerCertificateValidator": true

в конфигурацию ReRoutes (см. https://ocelot.readthedocs.io/en/latest/features/configuration.html).

Другие варианты:

  • с использованием действующего сертификата (довольно сложно достичь для localhost)
  • зарегистрируйте самоподписанный сертификат в хранилище сертификатов вашего пользователя как заслуживающий доверия сертификат.

Мне нужно изменить ReRoute на Route, тогда мои маршруты перенаправляются правильно. Пожалуйста, используйте Route в файле конфигурации Ocelot.

В вашем проекте включен SSL, вам необходимо отключить SSL и удалить маршрут с HTTPS в файле launchSettings.json во всех проектах WEB API. Он будет успешно работать.

Другие вопросы по тегам