Преобразование, сохраняющее префиксы пространства имен

Я пытаюсь вставить раздел пользовательских настроек NLog в мой Web.config, используя этот раздел XDT:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" throwExceptions="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xdt:Transform="InsertIfMissing" >
    <targets>
        <target xsi:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="logfile" />
    </rules>
</nlog>

Когда я запускаю XDT-преобразование, мой Web.Debug.config содержит:

<nlog throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
    <targets>
        <target d4p1:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" xmlns:d4p1="http://www.w3.org/2001/XMLSchema-instance" />
    </targets>
    <rules>
        <logger name="*" minlevel="Trace" writeTo="logfile" />
    </rules>
</nlog>

Как правило, префикс пространства имен является произвольным, поэтому преобразование xsi в d4p1 не вызовет проблем.

Тем не менее, я получаю исключение времени выполнения в моем приложении от NLog, когда я использую d4p1, Изменение экземпляров вручную d4p1 в xsi устраняет проблему, но она подрывает для меня утилиту преобразования конфигурации, если пользователю необходимо впоследствии вручную изменить файл.

Есть ли способ сохранить префиксы пространства имен с помощью XDT?

2 ответа

Решение

У нас была точно такая же проблема. Я не уверен, почему это внезапно начало происходить с конкретным проектом, но решение для нас было добавить пространство имен xsi в верхний уровень исходного файла конфигурации (то есть базовый файл, над которым работают преобразования). Так...

<configuration>

... станет...

<configuration xmlns:xsi="http://www.nlog-project.org/schemas/NLog.xsd">

Это добилось цели.

Альтернативный подход, который также работал, заключался в применении преобразований к дочерним элементам элемента nlog.

Надеюсь, что это помогает кому-то.

Я начал видеть эту проблему, когда переместил свой атрибут xdt:Transform из тегов target и rule в nlog. Перемещение их обратно к исходным тегам решило проблему так:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" throwExceptions="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets xdt:Transform="InsertIfMissing">
    <target xsi:type="File" name="logfile" fileName="H:\testLog.txt" layout="${longdate} ${uppercase:${level}} ${message}" />
  </targets>
  <rules xdt:Transform="InsertIfMissing">
    <logger name="*" minlevel="Trace" writeTo="logfile" />
  </rules>
</nlog>
Другие вопросы по тегам