Introduction

The following tips relate to working with the SharePoint SPWebConfigModification API in order to manage changes to the web.config. Note it's not recommended that you modify the web.config directly as this may have side effects with the running of your SharePoint instance, and changes may be lost when installing updates or service packs.

Avoiding Duplicates

When working with the SPWebConfigModification API, the name property should be set to an xPath expression that identifies the configuration change being made. This should be an expression relative to the Path property. This prevents duplicate changes being made in the web.config. If an arbitrary name is used instead, then the system will not throw an error but may lead to duplicate entries.

SPWebService service = SPWebService.ContentService;

SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;

myModification.Path = "configuration/system.web/httpModules";

myModification.Name = "add[@name='myModule']";

myModification.Sequence = 0;
myModification.Owner = this.GetType().FullName;
myModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
myModification.Value = "<add name='myModule' type='myModule, myAssembly' />";

service.WebConfigModifications.Add(myModification);
service.Update();
service.ApplyWebConfigModifications();

Removing Entries

To ensure your entries can be removed via code (such on feature deactivate), it's a good idea to set the owner of the SPWebConfigModification instance as in the example above. It's then possible to loop through the config settings and remove the entries that were previously set by the same codebase

SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
Collection<spwebconfigmodification>modsCollection = webApp.WebConfigModifications;
int count = modsCollection.Count;
for (int i = count-1; c >= 0; i--)
{
 SPWebConfigModification mod = modsCollection[i];
 if (mod.Owner == this.GetType().FullName)
 {
  modsCollection.Remove(mod);
 }
}
webApp.Update();
webApp.Farm.Services.GetValue<spwebservice>().ApplyWebConfigModifications();</spwebservice></spwebconfigmodification>