首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何配置wwwroot核心多微服务应用程序和Azure AKS入口路由,使其不会破坏ASP.NET文件夹中的资源

如何配置wwwroot核心多微服务应用程序和Azure AKS入口路由,使其不会破坏ASP.NET文件夹中的资源
EN

Stack Overflow用户
提问于 2018-09-19 19:07:54
回答 3查看 1.7K关注 0票数 2

我有两个ASP.NET核心应用程序。一个是Headless CMS (API),另一个是Razor Pages博客前端(带有一个与Headless CMS/API通信的REST客户端)。

然后我就有了一个Azure AKS集群。在其中,我有一个入口资源,其中包含以下路由(根据以下AKS文档中的说明:https://docs.microsoft.com/en-us/azure/aks/ingress-tls#create-an-ingress-route )。每个路由映射到上面提到的每个应用程序/服务:

代码语言:javascript
复制
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应用程序可以正常工作,但是当我导航到第二个路径,mydomain.westeurope.cloudapp.azure.com/blog,我得到了一堆404:s,因为博客应用程序的根路径现在是相对于/blog入口路径,这反过来又破坏了wwwroot文件夹中的所有资源(css,javascript,图像等)。

我应该如何配置我的ASP.NET核心博客应用和/或我的入口对象?

404:s

代码语言:javascript
复制
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 <- works

下面是Index.cshtml剃刀页面中的常规img标签(来自默认的ASP.NET Core2.1剃刀页面web应用程序)。我没有更改代码中的任何内容。

代码语言:javascript
复制
<img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />
EN

回答 3

Stack Overflow用户

发布于 2018-09-21 21:55:37

问题

看起来你的代理重写了路径。

proxy之前的代理: /blog/images/banner1.png

  • After proxy: /images/banner1.png

Asp生成绝对(主机相对)链接(仅限路径,但以斜杠“/”开头)。这意味着,我们必须告诉框架,它必须为所有URL加上"/blog“前缀。

解决方案

通过在启动类中插入以下代码片段来执行此操作(适用于asp.net核心2.1):

代码语言:javascript
复制
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“为前缀-这样它们在你的开发机器上就会被破坏。

使用配置

您需要将其设置为可配置,例如:

代码语言:javascript
复制
        var basePath = Configuration.GetSection("BASE_PATH").Value;
        if (basePath != null)
        {
            Console.WriteLine($"Using base path '{basePath}'");
            // app.Use().. goes here
        }

(假设您在启动时从env vars读取配置。)

…并在kubernetes仓库中提供此env var:

代码语言:javascript
复制
...
 containers:
  - name: myapp
    image: myappimage
    env:
      - name: BASE_PATH
        value: "/blog"
票数 4
EN

Stack Overflow用户

发布于 2018-09-20 09:05:43

你想用nginx.ingress.kubernetes.io/rewrite-target注释你的入口。例如:

代码语言:javascript
复制
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

希望它能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2019-07-26 09:45:05

按照以下步骤运行代码:

在k8s-yaml-file中使用路径基的

  1. deployment:pass环境变量

代码语言:javascript
复制
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"

  1. program:在Program.cs

中启用加载环境参数

代码语言:javascript
复制
var builder = new WebHostBuilder()
    .UseContentRoot(Directory.GetCurrentDirectory())
    // ..
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        // ..  
        config.AddEnvironmentVariables(); // <---
        // ..
    })
    // ..

  1. startup:在Startup.cs

中应用UsePathBaseMiddleware

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52404475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档