如何配置 ASP.NET Core 以对两个已部署的应用程序进行不同的配置

Posted

技术标签:

【中文标题】如何配置 ASP.NET Core 以对两个已部署的应用程序进行不同的配置【英文标题】:How to configure ASP.NET Core to have different configurations for two deployed applications 【发布时间】:2021-12-05 19:23:50 【问题描述】:

我一直在学习 ASP.NET 环境变量和配置。

我看到,默认情况下,在我自己的本地环境中运行时,放置在 appsettings.Development.json 中的任何设置都会覆盖 appsettings.json 中的相同设置。并且 appsettings.Development.json 未部署,因此在部署时不会覆盖任何设置。

我的问题:有没有人知道如何为多个部署的配置使用相同的机制?

例如,我有一个网站和该网站的演示版。两者都使用相同的代码库,但演示站点的一些设置需要不同。如果我可以创建 appsettings.Demo.json 并在其中放置需要仅为演示站点覆盖的任何设置,那就太好了。

目前,我只是在文件中设置了IsDemoSite 设置。这可行,但如果我可以有不同的配置设置,它会更加优雅。

我找不到任何关于部署时具有不同配置的文档。

另外,其中一个区别是演示站点使用了不同的数据库连接字符串。所以我需要能够在运行迁移等时设置我正在处理的版本。

【问题讨论】:

设置ASPNETCORE_ENVIRONMENT环境变量为Demo,然后它会加载演示设置 docs.microsoft.com/en-us/aspnet/core/fundamentals/environments 你在正确的轨道上。您可以根据需要创建 appsettings.Demo.json 文件和许多配置文件。在您的演示站点上,将 ASPNETCORE_ENVIRONMENT 环境变量值设置为 Demo。更多请查看this out 【参考方案1】:

好吧,我也有同样的事情要做 - 你的自定义 appsettings 文件已经步入正轨。

就我而言,我想要一个单独的开发、生产、wsl 和 docker 配置。解决方案 - 鉴于我在不同的虚拟实例上运行 prod 和 dev,是使用旧的和真正的 ASPNETCORE_ENVIRONMENT 变量。

我创建了appsettings(appsettings.docker 等)所需的变体,并为给定文件设置了上述变量。

此外,当我的应用程序启动时,它会获取正确文件的路径(部分名称取自 ASPNETCORE_ENVIRONMENT)并将其作为普通 json 文件加载到 CreateHostBuilder.ConfigureAppConfiguration 方法。它完全符合我的要求 - 应该对你有好处。

您可以找到示例here。

至于设置ASPNETCORE_ENVIRONMENT - 取决于您所在的主机系统:

对于码头工人
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=publish /app .
ENV ASPNETCORE_ENVIRONMENT="docker"
ENTRYPOINT ["dotnet", "ScanApp.dll"]

对于 Windows: 关注this 指南 - 它将引导您完成全局和应用内设置

对于 WSL - 在您的 launchSettings.json:

"WSL": 
      "commandName": "WSL2",
      "launchBrowser": true,
      "launchUrl": "https://localhost:5051",
      "environmentVariables": 
        "ASPNETCORE_ENVIRONMENT": "wsl",
        "ASPNETCORE_URLS": "https://localhost:5051;http://localhost:5050"
      ,
      "distributionName": "Ubuntu-20.04"
    

【讨论】:

我在这里缺少关键细节。您在哪里以及如何设置 ASPNETCORE_ENVIRONMENT 变量?您如何在配置之间切换?您的应用程序究竟是如何“获取正确文件的路径”的?我会看看这个例子。 @JonathanWood:一种方法(可以说是最好的)是在 web.config 的 <environmentVariables> 元素中设置它,假设您正在部署到 IIS。这会为 进程 设置环境,因此您可以在同一台服务器上部署多个配置。 默认主机构建器加载appsettings.jsonappsettings.environment.json(它是这样插值的),因此它获取配置环境的设置。 当您发布您的应用程序时,它会创建一个配置了aspNetCore 模块的web.onfig。您需要在此处添加<environmentVariables>,请参阅this documentation。 @JonathanWood - 我已经更新了我的答案,这应该对你有所帮助。

以上是关于如何配置 ASP.NET Core 以对两个已部署的应用程序进行不同的配置的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 应用程序的多主机部署

七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

将 ASP NET Core 部署到 IIS

Windows + IIS 环境部署Asp.Net Core App

如何在宝塔面板启用 ASP.NET CORE 网站并自动申请 HTTPS 证书

ASP.NET Core on K8S深入学习部署过程解析与Dashboard