SPWebConfigModification - 写入彼此修改的功能

时间:2013-04-15 14:58:17

标签: sharepoint-2010

我正在使用带共享点2010的log4Net。我有一个功能,当我的灵魂部署在错误模式下使用以下代码时自动添加log4net配置

SPWebService service = SPWebService.ContentService;

            service.WebConfigModifications.Clear();
  //ADD log4Net config section
            service.WebConfigModifications.Add(new SPWebConfigModification()
            {
                Path = "configuration/configSections",
                Name = "section[@name='log4net']",
                Sequence = 0,
                Owner = CREATE_NAME,
                Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
                Value = string.Format(@"<section name='log4net' type='log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version={0}, Culture=neutral, PublicKeyToken={1}' />", LOG4NET_VERSION, LOG4NET_PUBLIC_KEY_TOKEN)
            });


            string log4netConfig = @"<log4net>
                                        <appender name='RollingFileAppender' type='log4net.Appender.RollingFileAppender'>
                                            <file value='C:\\logs\\Logger.log' />
                                            <appendToFile value='true' />
                                            <rollingStyle value='Composite' />
                                            <datePattern value='yyyyMMdd' />
                                            <maxSizeRollBackups value='200' />
                                            <maximumFileSize value='50MB' />
                                            <layout type='log4net.Layout.PatternLayout'>
                                                <conversionPattern value='%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n' />
                                            </layout>
                                        </appender>
                                        <root>
                                          <level value='ERROR' />
                                          <appender-ref ref='RollingFileAppender' />
                                        </root>
                                    </log4net>";
            //add error default config
            service.WebConfigModifications.Add(new SPWebConfigModification()
            {
                Path = "configuration",
                Name = "log4net",
                Sequence = 0,
                Owner = CREATE_NAME,
                Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
                Value = log4netConfig
            });

service.Update();
            service.ApplyWebConfigModifications();

我想创建另一个功能,它将log4net的错误模式写入并将其更改为debug,以便最终用户无需手动修改Web配置。 问题是当第二个功能被激活时,它会删除第一个功能添加的所有内容。

这是标准行为吗?任何将激活的功能都会删除其他功能的更改。

编辑2

复制步骤

创建2个功能。他们俩都应该在web配置中添加一些不同的条目。

  1. 激活功能1 - 功能1更改在Web配置中
  2. 激活功能2 - 功能2更改在Web配置中,但功能1 变化消失了
  3. 停用这两项功能

    1. 激活功能2 - 功能2更改在Web配置中
    2. 激活功能1 - 功能1更改在Web配置但功能中 2个变化消失了

2 个答案:

答案 0 :(得分:1)

删除第一个Web配置的原因是代码块:

service.WebConfigModifications.Clear();

基本上,您说在添加功能中的项目之前,您将清除Web配置中设置的所有其他配置。删除所述代码块应该可以解决您的问题。

如果您在激活或停用功能时需要执行其他操作,请尝试使用功能接收器。可以找到一个从Web配置和功能接收器开始的好例子here

另外,为了让您对上面的代码块有更多的了解,可以解决问题,您可以查看另一个有类似问题的人here

答案 1 :(得分:0)

如果我理解正确的话,发生的事情是你添加一个webconfigmodification,这在技术上并没有“添加”,因为它还没有实现。当您创建第二个修改时,它会覆盖您创建的第一个修改,而第一个修改将删除所做的第一个修改,这就是应用的修改。