调试代码时Web.config没有转换

问题描述 投票:0回答:3

我有一个主要的

Web.config
文件,下面有一个
Web.Test.config
Web.Development.Config

当我在测试配置上通过 SlowCheetah 预览转换时,它似乎正确地转换了值。

当我将我的构建环境从开发切换到测试并尝试调试应用程序时,应用程序在主

Web.config
文件中的任何值下运行(即它没有转换任何东西)。

如何让构建环境在调试时选择正确的配置,而不是总是使用基本的

Web.config
文件?这可能吗?

c# visual-studio visual-studio-2015 app-config slowcheetah
3个回答
57
投票

您可以在构建时转换

Web.config
。将此目标添加到
*.csproj
文件:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" />
<Target Name="BeforeBuild">
    <TransformXml 
        Source="Web.Base.config" 
        Transform="Web.$(Configuration).config" 
        Destination="Web.config" />
</Target>

保留

Web.Base.config
中的原点配置。它足以启用转换并且适用于任何 XML 配置文件。根本不再需要 SlowCheetah。

为了避免在发布时进行不必要的转换,请使用它(并查看评论和下面的链接以获取更多详细信息):

从评论中的提醒我意识到我也有一个 发布时 Visual Studio 两次转换 XML 的问题 一个专案。解决这个问题的方法是在 像这样的目标标签:

<Target Name="BeforeBuild" Condition="'$(PublishProfileName)' == '' And '$(WebPublishProfileFile)' == ''">

http://sebnilsson.com/a5410281/asp-net-transform-web-config-with-debug-release-on-build/


5
投票

XML 转换仅在您发布 Web 应用程序时应用,而不是在构建期间应用。

这篇博客文章详细介绍了使用构建设置的工作。


-1
投票

我应用的解决方案是:

在应用程序启动时(例如:Global.asax),使用以下代码片段更改配置文件路径:

var oldConfigPath = (string) AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE");
var directory = Directory.GetParent(oldConfigPath).FullName;

//Check if is using Web.config in source directory
if (Directory.GetFiles(directory).Any(s => s.EndsWith(".csproj")))
{                
   //Modify config file that must be used
   var path = $"{Assembly.GetExecutingAssembly().CodeBase}.config";
   AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);

   //Reset ConfigManager
   typeof(ConfigurationManager)
   .GetField("s_initState", BindingFlags.Static | BindingFlags.NonPublic)
   .SetValue(null, 0);

}
© www.soinside.com 2019 - 2024. All rights reserved.