我想我遇到了一个奇怪的交互,我的发布配置文件的名称影响了发布的 Web.config 的内容。
对于上下文,我有 2 个解决方案配置;Release & Staging,以及一个名为“ Release.pubxml ”的文件夹发布配置文件。以下是所涉及的三个 Web 配置的精简版本。
网络配置:
<configuration>
<connectionStrings>
<add name="DBEntities" connectionString="{Web.config connection string}" />
</connectionStrings>
<appSettings>
<add key="WEBSITEURL" value="http://website.com" />
<add key="ADMINURL" value="http://admin.website.com" />
</appSettings>
</configuration>
Web.Release.config:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add xdt:Transform="SetAttributes" xdt:Locator="Match(name)" name="DBEntities" connectionString="{Web.Release.config connection string}" />
</connectionStrings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
<system.webServer>
<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPtoHTTPSredirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Web.Staging.config:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add xdt:Transform="SetAttributes" xdt:Locator="Match(name)" name="DBEntities" connectionString="{Web.Staging.config connection string}" />
</connectionStrings>
<appSettings>
<add xdt:Transform="SetAttributes" xdt:Locator="Match(key)" key="WEBSITEURL" value="http://stagingwebsite.com" />
<add xdt:Transform="SetAttributes" xdt:Locator="Match(key)" key="ADMINURL" value="http://admin.stagingwebsite.com />
</appSettings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
</configuration>
我最近调整了我们的Staging web 配置,并尝试在Release.pubxml配置文件下发布,但 Configuration 设置为Staging,而不是Release。我预期的结果是原始 Web.config 文件,应用了所有 Web.Staging.config xdt 转换。
最终发生的是 Web.Staging.config 和 Web.Release.config 转换为 Web.config 的科学怪人组合:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add xdt:Transform="SetAttributes" xdt:Locator="Match(name)" name="DBEntities" connectionString="{Web.Release.config connection string}" />
</connectionStrings>
<appSettings>
<add xdt:Transform="SetAttributes" xdt:Locator="Match(key)" key="WEBSITEURL" value="http://stagingwebsite.com" />
<add xdt:Transform="SetAttributes" xdt:Locator="Match(key)" key="ADMINURL" value="http://admin.stagingwebsite.com />
</appSettings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
<system.webServer>
<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPtoHTTPSredirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
您会注意到它具有Release连接字符串、Staging WEBSITEURL/ADMINURL 和Release HTTP 规则。
我在设置中的任何地方都找不到任何发布配置的痕迹。我检查了配置管理器,所有项目都设置为Staging并且我已经多次清理/重建。我还使用 VS 2022 和 VS 2019 以及多个单独的解决方案对其进行了测试;每个都产生了相同的结果。
最终“修复”它的是将名称从“ Release.pubxml ”更改为Release.pubxml或Staging.pubxml 以外的任何名称。尽管您通常不想将发布配置文件命名为配置之外的任何名称,但为什么发布配置文件的名称会覆盖您设置的配置构建?通过进一步调查,它似乎可能首先转换选择的配置构建(Staging),然后转换与您的发布配置文件同名的任何配置(Release)。
这种交互对我来说似乎非常危险,所以任何人都可以向我解释为什么 Visual Studio 会这样做(或者如果我可能遇到了错误)?