zoukankan      html  css  js  c++  java
  • MOSS 2013研究系列动态修改WebConfig(上) 欧阳锋

      在开发和部署MOSS应用的时候,我们时常需要定义一些配置信息,这些信息需要部署到对应网站的虚拟目录里面的Web.Config文件里。最简单的办法是直接手工修改,简单容易,技术含量低,稳定性高,但其也有一定的缺点,人为操作,容易出错,而且部署人需要管理权限较高,需要远程到服务器上。

      因此,我们建议采用代码直接动态修改,将修改的操作放置于Feature激活事件里面,这样,当功能部署到MOSS应用的时候,激活功能Feature的时候,动态的将需要的配置信息写入到Web.Config里面,收回功能的时候,将配置信息自动移除掉,符合软件设计思想。

      闲话少说,言归正传,网上流行的方法是采用SPWebConfigModification对象进行修改,如下代码:

    
     [Guid("9bac04b2-d839-4306-a0a2-9f17b17c0165")]
        public class Feature1EventReceiver : SPFeatureReceiver
        {
            private const string SPWebConfigModificationOwner = "SPAdmin";
    
            public override void FeatureActivated(SPFeatureReceiverProperties properties)
            {
                string name, xpath, value;
    
                SPWebApplication webApp = (SPWebApplication)properties.Feature.Parent;
    
                #region ..: appSettings :..
                name = "add[@key='TrustedGroup']";
                xpath = "configuration/appSettings";
                value = "<add key='TrustedGroup' value='Trusted' />";
                ModifyWebConfig(webApp, name, xpath, value, SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode);
    
                name = "add[@key='KeyName']";
                xpath = "configuration/appSettings";
                value = "<add key='KeyName' value='Lubaochun' />";
                ModifyWebConfig(webApp, name, xpath, value, SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode);
                #endregion
    
                try
                {
                    webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();
                }
                catch (Exception ex)
                {
                    RemoveAllModifications(properties);
                    throw ex;
                }
            }
    
            public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
            {
                RemoveAllModifications(properties);
    
                try
                {
                    SPWebApplication webApp = (SPWebApplication)properties.Feature.Parent;
                    webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();
                }
                catch (Exception ex)
                {
                    System.Diagnostics.EventLog eventLog = new System.Diagnostics.EventLog();
                    eventLog.Source = SPWebConfigModificationOwner;
                    eventLog.WriteEntry(ex.Message);
                    throw ex;
                }
            }
    
            private void RemoveAllModifications(SPFeatureReceiverProperties properties)
            {
                SPWebApplication webApp = (SPWebApplication)properties.Feature.Parent;
    
                List<SPWebConfigModification> modificationsToRemove = new List<SPWebConfigModification>();
    
                foreach (SPWebConfigModification modification in webApp.WebConfigModifications)
                    if (modification.Owner == SPWebConfigModificationOwner)
                        modificationsToRemove.Add(modification);
    
                foreach (SPWebConfigModification modification in modificationsToRemove)
                    webApp.WebConfigModifications.Remove(modification);
    
                webApp.Update();
            }
    
            private void ModifyWebConfig(SPWebApplication webApp, String nameModif, String pathModif, String valueModif, SPWebConfigModification.SPWebConfigModificationType typeModif)
            {
                SPWebConfigModification modification = new SPWebConfigModification(nameModif, pathModif);
                modification.Value = valueModif;
                modification.Sequence = 0;
                modification.Type = typeModif;
                modification.Owner = SPWebConfigModificationOwner;
    
                try
                {
                    webApp.WebConfigModifications.Add(modification);
                    webApp.Update();
                }
                catch (Exception ex)
                {
                    System.Diagnostics.EventLog eventLog = new System.Diagnostics.EventLog();
                    eventLog.Source = SPWebConfigModificationOwner;
                    eventLog.WriteEntry(ex.Message);
    
                    throw ex;
                }
            }
    
            public override void FeatureInstalled(SPFeatureReceiverProperties properties) { }
    
            public override void FeatureUninstalling(SPFeatureReceiverProperties properties) { }
     
        }
    

       下图为核心方法SPWebConfigModification的调用原理图:

      经过部署测试,发现没有问题,可以动态修改Web.config里面的配置信息,但是发现它一个问题,就是这段代码一旦修改,会将所有的站点集的虚拟目录都统统改掉,而且该Feature必须是在SPWebApplication范围下的,它适合于对整体服务器场进行统一修改。

      但是,我们往往不想让它将所有的WebApp的虚拟目录配置文件修改,只是修改该Feature所属的网站集所对应的虚拟目录配置文件,这样我们需要对代码进行升级,下一个章节将对其进行详细的说明和代码示范。

    您的支持,我的动力!
  • 相关阅读:
    《结对-贪吃蛇游戏-测试过程》
    《课后作业-阅读任务-阅读提问-2》
    课后作业-阅读任务-阅读提问-3
    《20171005-构建之法:现代软件工程-阅读笔记》
    《结对-贪吃蛇游戏-项目进度》
    《团队-科学计算器-项目进度》
    《团队-科学计算器-代码设计规范》
    《团队-科学计算器-开发环境搭建过程》
    自制3D打印机---挤出头
    __construct 与 ThinkPhp _initialize 的区别
  • 原文地址:https://www.cnblogs.com/luking/p/3068584.html
Copyright © 2011-2022 走看看