Как настроить мультисервисное приложение ASP.NET Core и входящие маршруты Azure AKS, чтобы они не нарушали ресурсы в папке wwwroot - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть два приложения ASP.NET Core.Одним из них является Headless CMS (API), а другим - внешний интерфейс блога Razor Pages (с клиентом REST, который связывается с Headless CMS / API).

У меня есть кластер Azure AKS.В нем у меня есть входной ресурс со следующими маршрутами (согласно инструкциям из следующих документов AKS: https://docs.microsoft.com/en-us/azure/aks/ingress-tls#create-an-ingress-route).Каждый маршрут сопоставлен с каждым из приложений / сервисов, упомянутых выше:

spec:
  rules:
  - host: mydomain.westeurope.cloudapp.azure.com
    http:
      paths:
      - backend:
          serviceName: headless-cms-svc
          servicePort: 80
        path: /
      - backend:
          serviceName: blog-svc
          servicePort: 80
        path: /blog

Когда я сейчас перехожу к первому маршруту, mydomain.westeurope.cloudapp.azure.com, приложение безголового CMS работает, как и ожидалось, но когда я перехожу ко второму маршрутуroute, mydomain.westeurope.cloudapp.azure.com/blog, я получаю кучу 404: s, потому что корневой путь приложений блога теперь относится к входному маршруту /blog, который, в свою очередь, разрушает все ресурсы (css, javascript, images и т. д.) в папке wwwroot.

Как настроить приложение блога ASP.NET Core и / или мой входной объект?

404: s

https://mydomain.westeurope.cloudapp.azure.com/css/site.min.css?v=kHvJwvVAK1eJLN4w8xygUR3nbvlLmRwi5yr-OuAO90E

https://mydomain.westeurope.cloudapp.azure.com/images/banner1.svg

https://mydomain.westeurope.cloudapp.azure.com/images/banner2.svg

https://mydomain.westeurope.cloudapp.azure.com/js/site.min.js?v=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU

Если я добавлю сегмент URL /blog ресурсы обслуживаются должным образом.https://mydomain.westeurope.cloudapp.azure.com/blog/images/banner1.svg <- работает </p>

А вот обычный тег img на странице Index.cshtml Razor (из стандартного веб-приложения ASP.NET Core 2.1 Razor Pages).Я ничего не изменил в коде.

<img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Проблема

Похоже, ваш прокси-сервер переписывает путь.

  • Перед прокси: /blog/images/banner1.png
  • После прокси: / images/banner1.png

Asp генерирует абсолютные (относительные хосты) ссылки (только путь, но начинается с косой черты "/").Это означает, что мы должны сообщить платформе, что она должна ставить перед всеми URL-адресами префикс "/blog".

Solution

Сделайте это (для ядра 2.1 asp.net), вставив следующий фрагмент кода вваш класс запуска:

app.Use((context, next) =>
{
    context.Request.PathBase = new PathString("/blog");
    return next();
});

Пример кода из: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1

Вставьте этот фрагмент перед любым другим промежуточным программным обеспечением в вашем методе Configure.

Вы можете проверить это на своемлокальная машина тоже.Все сгенерированные ссылки должны начинаться с префикса "/ blog", чтобы они не работали на вашем компьютере разработчика.

Используйте конфигурацию

Вам нужно будет настроить ее, например, так:

        var basePath = Configuration.GetSection("BASE_PATH").Value;
        if (basePath != null)
        {
            Console.WriteLine($"Using base path '{basePath}'");
            // app.Use().. goes here
        }

(Предполагая, что вы читаете конфигурацию из env vars при запуске.)

… и укажите этот env var в вашем депозите kubernetes:

...
 containers:
  - name: myapp
    image: myappimage
    env:
      - name: BASE_PATH
        value: "/blog"
0 голосов
/ 26 июля 2019

Выполните следующие шаги, чтобы запустить код:

  1. развертывание : передать переменную среды с основанием пути в k8s-yaml -файл
apiVersion: apps/v1
kind: Deployment
# ..
spec:
  # ..
  template:
    # ..
    spec:
      # ..
      containers:
        - name: test01
          image: test.io/test:dev
          # ...
          env:
            # define custom Path Base (it should be the same as 'path' in Ingress-service)
            - name: API_PATH_BASE # <---
              value: "blog"
программа : включить загрузку параметров среды в Program.cs
var builder = new WebHostBuilder()
    .UseContentRoot(Directory.GetCurrentDirectory())
    // ..
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        // ..  
        config.AddEnvironmentVariables(); // <---
        // ..
    })
    // ..
запуск : применить UsePathBaseMiddleware in Startup.cs
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    private readonly IConfiguration _configuration;

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var pathBase = _configuration["API_PATH_BASE"]; // <---

        if (!string.IsNullOrWhiteSpace(pathBase))
        {
            app.UsePathBase($"/{pathBase.TrimStart('/')}");
        }

        app.UseStaticFiles(); // <-- StaticFilesMiddleware must follow UsePathBaseMiddleware

        // ..

        app.UseMvc();
    }

    // ..
}
0 голосов
/ 20 сентября 2018

Вы хотите аннотировать свой Ingress с nginx.ingress.kubernetes.io/rewrite-target.Например:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: mydnsname.westeurope.cloudapp.azure.com
    http:
      paths:
      - backend:
          serviceName: headless-cms-svc
          servicePort: 80
        path: /
      - backend:
          serviceName: blog-svc
          servicePort: 80
        path: /blog

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...