我已经收集了一份(希望有用的)总结,介绍了我研究过的实现本文主题的方法,以及我对它们的问题。如果您发现其他更好的方法,特别是解决我提到的方法无法解决的问题的方法,请告诉我。
将连接字符串留在web.config中,并使用XDT/msdeploy转换根据我的活动构建配置(例如,web.PublicTest.config文件)替换它们的设置。我的问题是我将一些特定于服务器的设置合并并深埋到一个其他全局相同但有许多配置元素的文件中。此外,我不能在多个对等级别的应用程序之间共享连接字符串定义。
在web.config中指定configSource="DeveloperLocalConnectionStrings.config"值,然后将此值进行XDT转换以指向代码库中多个环境特定文件之一。我的问题是我将所有环境的密码发送到所有目标位置(当然还包括SVN),并且在服务器上有未使用的配置部分等待被意外使用。
将连接字符串指定为machine.config文件而不是web.config。问题:谁会想在machine.config中找到连接字符串,因此结果可能会产生意外名称冲突。
指定configSource="LocalConnectionStrings.config",不要转换该值,并编辑项目xml以排除连接字符串配置的部署。 http://msdn.microsoft.com/en-us/library/ee942158.aspx#can_i_exclude_specific_files_or_folders_from_deployment-这是我发现来满足我需要专有(非分布式)Web应用程序的最佳解决方案,但是我很怕另一个团队成员某天会复制生产站点以测试某些原因,那么Voila!生产数据库现在正在UAT期间被修改。(更新:我发现在这种情况下无法使用一键发布,只能使用带有-skip参数的msdeploy命令行。如上所述排除文件与将其设置为"None"编译操作相同,导致软件包从部署目标中删除它。)
将部署包连接到提示连接字符串(如果尚未设置,则不知道如何执行此操作,但我知道它是可能的)。这将产生与上面#4类似的结果。
指定configSource="..\ConnectionStrings.config"。对于我的需求来说真的很棒,因为我可以在我选择的应用程序之间共享配置,并且在我的应用程序目录中没有任何特定于机器的内容。不幸的是,在此属性中不允许父路径(就像对于'appSettings file=""'一样-还要注意您可以在configSource=引用中漂亮地使用file=)。
p.s. 这些解决方案的一些讨论在这里:ASP.Net配置文件 -> 多个开发者和部署服务器的连接字符串