2

我想我遇到了一个奇怪的交互,我的发布配置文件的名称影响了发布的 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.pubxmlStaging.pubxml 以外的任何名称。尽管您通常不想将发布配置文件命名为配置之外的任何名称,但为什么发布配置文件的名称会覆盖您设置的配置构建?通过进一步调查,它似乎可能首先转换选择的配置构建(Staging),然后转换与您的发布配置文件同名的任何配置(Release)。

这种交互对我来说似乎非常危险,所以任何人都可以向我解释为什么 Visual Studio 会这样做(或者如果我可能遇到了错误)?

4

0 回答 0