【问题标题】:Azure web app deployed as docker container endless 301 loop部署为 docker 容器的 Azure Web 应用程序无限 301 循环
【发布时间】:2021-01-18 17:10:13
【问题描述】:

我们正在尝试将我们的 REST Web API 从作为 Windows .NET Core 3.1 堆叠式 Web 应用程序托管迁移到 Azure 上 Linux 上的容器化 Web 应用程序。

到目前为止,我们已成功将映像推送到 Azure 容器注册表,在该注册表中它会被自动提取并成功部署到应用服务。不幸的是,该应用程序尚未正常工作。当尝试从我们的 API (GET https://foo.azurewebsites.net/api/configuration) 的(匿名)端点获取一些配置数据时,而不是像以前那样返回数据 - 我得到一个 301(永久移动)状态代码,它完全指向本身:location: https://foo.azurewebsites.net/api/configuration 导致重定向循环。

到目前为止,我不知道为什么我会得到 301,我很高兴有任何提示。

兴趣点:

  • Docker:镜像的基础是:mcr.microsoft.com/dotnet/core/aspnet:3.1
  • Azure:身份验证/授权已关闭
  • Azure:未安装 Front Doors
  • 该应用正在正确地为 Swagger UI 提供服务。
  • Docker 映像在本地运行良好。

【问题讨论】:

  • 您可能需要在 Startup 中的代码和示例 api 创建一个测试项目,然后我们才能调试问题。
  • 我知道你的应用部署在linux下。我的建议是保证程序正常运行,这样就可以在本地部署iis了。
  • @JasonPan 感谢您的支持。抱歉,如果没有遇到这种情况,但我们正在尝试将 Windows/IIS 迁移到 Docker/Linux。我们的代码在之前的部署设置中已经运行良好。

标签: asp.net-core azure-web-app-service azure-container-registry


【解决方案1】:

这是我解决问题的方法:事实证明,永久重定向循环的原因是代理在 Azure 部署中的工作方式(感谢 Jason Pan 为我指出该方向)和以下代码我们在Startup:

services.AddControllersWithViews()
        .AddMvcOptions(o =>
        {
           ...
           o.Filters.Add(new RequireHttpsAttribute { Permanent = true }); // REMOVE THIS LINE
           ...
        });

删除RequireHttpsAttribute 过滤器后,应用程序开始按预期运行。由于我已将 TLS/SSL 设置配置为仅允许 HTTPS,因此我认为省略过滤器是安全的。

2021-01-20 更新

我刚刚发现有一个更好的方法可以做到这一点,不需要删除RequireHttpsAttribute过滤器。问题的核心是 Kestrel 不知道通信是通过安全通道进行的,因为反向代理正在通过 http 将请求转发到 Kestrel。所以我们需要启用标头的转发。对于 .NET Core 2.x 应用程序,这意味着遵循Configure ASP.NET Core to work with proxy servers and load balancers 中解释的步骤。幸运的是,对于 ASP.NET Core 3.x 应用程序,有一种更简单的方法(遗憾的是官方文档中尚未提及,但它是 preview 6 公告的一部分):只需设置 ASPNETCORE_FORWARDEDHEADERS_ENABLED环境变量为true。这可以在 Azure 门户中的 配置 > 应用程序设置下按常规方式完成:

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2017-05-25
    • 2020-02-16
    • 2018-11-07
    相关资源
    最近更新 更多