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);
}