您的答案是结合使用 web.config 转换和您的 SetParameters.xml 文件。我知道他们一开始可能会让人望而生畏,但如果你把时间花在学习上,就会有回报。
使用 web.config 转换,或根据机器名称命名连接字符串是 Bad Idea TM。这些解决方案将工作,但它们要求您在每次发布到新环境时重新构建 WebDeploy 包。您需要一个可以将任何包部署到任何环境的解决方案。
首先,您需要创建两个 web.config 转换。一个用于调试,一个用于发布。 Web.Debug.config 看起来像这样:
<connectionStrings>
<add name="MyDB" connectionString="Data Source=.\SQLExpress;Initial Catalog=MyDevDatabase;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
而您的 Web.Release.config 将包含一个占位符字符串。当您将包部署到目标环境中的 IIS 时,这些占位符将被更新。它应该是这样的:
<connectionStrings>
<add name="MyDB" connectionString="__targetenvironmentconnstring__"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
要在您进行部署时获得目标环境连接字符串,您需要在您的 Web 项目的 Properties 下更新您的发布配置文件。您将为每个目标环境创建一个发布配置文件(使用 Package 选项);所以 QA.pubxml、UAT.pubxml、Production.pubxml 等。当您使用 Publish 对话框时,Visual Studio 将引导您完成创建这些文件的向导。现在打开每个文件。您需要编辑文件的末尾以合并 MSDeployParameterValue 元素,就像我在这里所做的那样
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <!-- A bunch of info --> </PropertyGroup>
<ItemGroup>
<MSDeployParameterValue Include="$(DeployParameterPrefix)MyDB-Web.config Connection String">
<ParameterValue><!-- Your target environment connection string goes here! --></ParameterValue>
</MSDeployParameterValue>
</Project>
现在右键单击并在您的 Web 项目上发布,选择您想要的发布配置文件。在您指定的输出目录中,您将看到一个 SetParameters.xml 文件,其中包含您的目标连接字符串。这是部署时将进入 web.config 文件的内容,但至关重要的是,您也可以使用 IIS 手动导入包,并在部署时分配您自己的值,如下所示:
最后,您可以使用ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString 引用您的连接字符串,无论您在什么环境中,您都获得了正确的值!
要了解更多,我强烈建议阅读以下内容
你需要转几圈,但你永远不会回头。