Visual Studio 调试代码时,web.config不会转换

pftdvrlh  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(189)

我有一个主Web.config文件,下面有一个Web.Test.configWeb.Development.Config等。
当我在Test配置上通过SlowCheetah预览转换时,它似乎正确地转换了值。
当我将构建环境从开发切换到测试并尝试调试应用程序时,应用程序将在主Web.config文件中的任何值下运行(i.即它不转换任何东西)。
如何让构建环境在调试时选择正确的配置,而不是总是使用基本的Web.config文件?这可能吗?

mbskvtky

mbskvtky1#

您可以在构建时转换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不再需要了。
要避免发布时不需要的转换,请使用此(并查看下面的注解和链接以了解更多详细信息):
从注解中的提示中,我意识到在发布项目时,VisualStudio转换XML两次也有问题。解决这个问题的方法是向Target-tag添加一个条件,如下所示:

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

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

e4yzc0pl

e4yzc0pl2#

XML转换将仅在发布Web应用程序时应用,而不是在构建期间应用。
blog post详细说明了使用构建设置的解决方法。

zy1mlcev

zy1mlcev3#

我使用的解决方案是:
应用程序启动时(例如: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);

}

相关问题