4

我有一个 web 配置(被截断以显示重要的位),如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
        <section name="nhs-configuration" type="NHibernate.Search.Cfg.ConfigurationSectionHandler, NHibernate.Search" requirePermission="false" />
    </configSections>
    <nhs-configuration xmlns="urn:nhs-configuration-1.0">
        <search-factory>
            <property name="hibernate.search.default.directory_provider">NHibernate.Search.Store.FSDirectoryProvider, NHibernate.Search</property>
            <property name="hibernate.search.default.indexBase">C:\files\FTIndex</property>
            <property name="hibernate.search.default.indexing_strategy">event</property>
        </search-factory>
    </nhs-configuration>
    <nlog
        xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        internalLogFile="c:\temp\nlogInternal.log"
        internalLogLevel="Info"
        internalLogToConsole="true">
        <targets>
            <target
                xsi:type="Database"
                name="db"
                keepConnection="false"
                useTransactions="true"
                connectionStringName="MyConnString"
                dbProvider="Npgsql"
                commandText="insert into logs (timestamp, thread, severity, source, message, exception, username) values (now(), :thread, :severity, :source, :message, :exception, :username);">
                <parameter name="thread" layout="${threadid}" />
                <parameter name="severity" layout="${uppercase:${level}}" />
                <parameter name="source" layout="${logger}" />
                <parameter name="message" layout="${message}" />
                <parameter name="exception" layout="${exception:format=type,message,method:maxInnerExceptionLevel=10}" />
                <parameter name="username" layout="${aspnet-user-identity}" />
            </target>
            <target xsi:type="Debugger" name="outputWindow" layout="${uppercase:${level}} ${aspnet-user-identity} ${message} ${exception:format=type,message,method:maxInnerExceptionLevel=10}"/>
        </targets>
        <rules>
            <logger name="*" minlevel="Trace" writeTo="outputWindow" />
            <logger name="*" minlevel="Debug" writeTo="db" />
        </rules>
    </nlog>
</configuration>

我的转换文件如下所示:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <nhs-configuration>
        <search-factory>
            <property name="hibernate.search.default.indexBase" xdt:Locator="Match(name)" xdt:Transform="Replace">/var/ftindex</property>
        </search-factory>
    </nhs-configuration>
    <nlog
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        internalLogFile="/var/log/nlogInternal.log"
        internalLogLevel="Warn"
        internalLogToConsole="false"
        xdt:Transform="SetAttributes(internalLogFile,internalLogLevel,internalLogToConsole)">
        <targets>
            <target
                name="db"
                keepConnection="true"
                useTransactions="false"
                xdt:Locator="Match(name)"
                xdt:Transform="SetAttributes(keepConnection,useTransactions)"
                >
                <parameter name="thread" layout="${threadid}" />
                <parameter name="severity" layout="${uppercase:${level}}" />
                <parameter name="source" layout="${logger}" />
                <parameter name="message" layout="${message}" />
                <parameter name="exception" layout="${exception:format=type,message,method:maxInnerExceptionLevel=10}" />
                <parameter name="username" layout="${aspnet-user-identity}" />
            </target>
            <target name="outputWindow" xdt:Locator="Match(name)" xdt:Transform="Remove" />
        </targets>
        <rules>
            <logger name="*" minlevel="Debug" writeTo="db" />
            <logger writeTo="outputWindow" xdt:Locator="Match(writeTo)" xdt:Transform="Remove" />
        </rules>
    </nlog>
</configuration>

现在,除了这两个部分之外,我的 web.config 文件的所有部分在发布时都会正确转换。我的预感是这与某种 xml 命名空间冲突有关,但我猜它可能完全是另外一回事。

为什么这些部分不会转换?它们被完全忽略并最终在已发布的 web.config 中完全不变。

4

2 回答 2

5

事实证明,答案非常简单:只需从两个节点中删除默认命名空间声明即可。

以这种方式,您在 xml 节点上失去了漂亮的 Intellisense,但它可以正确转换。

于 2012-11-30T20:04:34.290 回答
4

实际上,您可以在主 Web.Config 中保留 Intellisense,并明确命名转换文件以匹配:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns:nlog="http://www.nlog-project.org/schemas/NLog.xsd">
  <nlog:nlog xdt:Transform="Replace">
    //Body omitted for brevity
  </nlog:nlog>
</configuration>

见:这篇文章

于 2016-04-05T16:11:52.200 回答