Azure 应用服务 - 是什么修改了我的 web.config?

Azure App Service - What modified my web.config?

我有一个来自 Kestrel 的 ASP.NET 核心网站 运行ning。它在生产中部署到 Azure App Service,另一个作为临时部署。

我喜欢将暂存配置为“类似生产”,因此我在 Azure 门户中应用服务的配置边栏选项卡中设置 ASPNETCORE_ENVIRONMENTNAME = Production。我可以从日志中看到代码将环境名称视为 staging still.

原来 <environmentVariable name="ASPNETCORE_ENVIRONMENTNAME" value="staging" /> 是在 Azure 实例上的 web.config 中设置的!!

现在,我的代码库中 web.config 或任何 t运行 表单中都没有这个集合,我也不使用 web.config,事实上我希望与它或 IIS 无关。

我的站点是通过 Azure Pipelines 部署的。我使用 environmentName 作为构建时间变量,但 YAML 只使用它一次,连接一些文本以构成资源组名称。

然后我 运行 dotnet deploy 使用与 Azure Pipelines 运行s 相同的命令行,但是 web.config 它写入最终发布输出文件夹包含有问题的行。

就在几周前,我重建并重新部署了我所有的 Azure 资源。一切都很干净,而且都是脚本化的。

它到底从哪里来的??!

我担心如果我删除它,有一天它会神奇地重新出现。闻起来很像微软的某个人认为这个自动魔法是个好主意。

请注意,我已尝试使用应用服务编辑器和 Kudu 删除它,但我不允许!!

Your app is currently in read only mode because you are running from a package file. To make any changes, please update the content in your zip file and WEBSITE_RUN_FROM_PACKAGE app setting.

所以如果我没有设置它,并且不允许我更改它,我该怎么办??

更新 1

我已经从 Pipelines 下载了工件,web.config具有设置。

根据管道日志,命令 运行 是这样的。

dotnet publish --configuration Release --output D:\a\s/dotnet-publish-output

但是当我 运行 我自己在我的机器上时,它不会干扰我的 web.config。

哇。所以在学校 运行 时,我想到 dotnet 命令写入 web.config 的值是正确的。它是怎么知道的?

它知道的唯一方法是从我在 Azure Pipelines 中设置并在我的 YAML 文件中使用的环境变量 azureResourceGroup: tz-$(environmentName)

当我在我的开发机器上 运行 与在 Azure 构建服务器上 运行ning 时,该环境变量未设置。

所以我在 运行 宁 dotnet publish 之前在我的开发机器上的环境中设置了 environmentName 并且,嘿 presto!它通过添加环境变量搞砸了我的 web.config!厉害了。

> $env:environmentName = "undocumented-feature"
> dotnet publish --configuration Release --output C:\DATA\Published
...
> cat C:\DATA\Published\web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\MyWebsiteYeah.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="undocumented-feature" />
        </environmentVariables>
      </aspNetCore>
      <security>
        <requestFiltering>
          <requestLimits maxUrl="32768" maxQueryString="262144"/>
        </requestFiltering>
      </security>
    </system.webServer>
  </location>
</configuration>
<!--ProjectGuid: 3E05D228-D9AF-4782-8E33-1F0E69992750-->

是不是很可怕

所以我通过将管道中的变量名称更改为 hostEnvironmentName.

解决了我的网站忽略门户中设置的变量的整个问题