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. Он будет успешно работать.