Web.config не преобразуется при отладке кода

У меня есть основной Web.config файл, и под этим есть Web.Test.config, Web.Development.Config и т.п.

Когда я предварительно просматриваю преобразование с помощью SlowCheetah в конфигурации "Конфигурация", кажется, что оно правильно преобразовывает значения.

Когда я переключаю свою среду сборки с разработки на тестирование и пытаюсь отладить приложение, приложение запускается с любыми значениями в основном Web.config файл (т.е. ничего не преобразующий).

Как заставить среду сборки выбрать правильную конфигурацию при отладке, а не просто всегда использовать базу Web.config файл? Это возможно?

3 ответа

Решение

Вы можете преобразовать 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 больше не нужен вообще.

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

Преобразования XML будут применяться только при публикации веб-приложений, а не во время сборки.

В этом блоге подробно описывается использование параметров сборки.

Решение, которое я применил, было:

При запуске приложения (например, 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);

}
Другие вопросы по тегам