您的位置:首页 > 其它

MOSS 2013研究系列---动态修改WebConfig(上)

2013-05-09 11:29 274 查看
  在开发和部署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所属的网站集所对应的虚拟目录配置文件,这样我们需要对代码进行升级,下一个章节将对其进行详细的说明和代码示范。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: