Thursday, May 13, 2010

Adding Entries in SharePoint Web Configuration File using SPWebConfigModification

One of requirement in my project was to edit the web.config of the current SharePoint web application.

After some goggling I came to know that SharePoint provides us the powerful API (
SPWebConfigModification)  to interact with web.config directly.

So I will be explaining some points that how to use this API:

I created a feature at WebApplication Level so that we will be able to Modify configuration file as soon as feature gets activated.

Actually SPWebConfigModification Class has Members Like 
  1. Name : (Property) used for managing name of section or node to set or read
  2. Path : (Property) used for managing node and this is Xpath expression
  3. Owner: (property) unique Name for owner of the
  4. Sequence (Property) used for managing Sequence Number of Modification (usually 0)
  5. Value : (property) used for setting (or reading) value to node
More Info on : (Msdn-great Source)

I will be explaining this modification class in two ways 
  1. Part 1: Adding a sub-section inside a section
  2. Part 2: Setting Node value of a section
Part  1:

Adding a SafeControl Entry inside <SafeControls> section of the web.config file

private
 void AddSafeControlEntry(SPWebApplication webApplication)
{
    SPWebConfigModification entry = new SPWebConfigModification();
    entry.Path = "configuration/SharePoint/SafeControls";
    entry.Name = "SafeControl [@Namespace='YourNamespaceName']";
    entry.Sequence = 0;
    entry.Owner = "somethingUniqueName";
    entry.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
    entry.Value =  "<SafeControl Assembly=\"YourfullAssemblyName\" Namespace=\"YourNamespaceName\" TypeName=\"*\" Safe=\"True\" />";
    webApplication.WebConfigModifications.Add (entry);   
}
Part 2:

Here I am setting users value of Node <allow users="*" /> to "?" in authorization section

private
}
 void ModifyAuthorization (SPWebApplication webApp)
{
    SPWebConfigModification testEntry = new SPWebConfigModification ("users",          "configuration/system.web/ authorization/ allow ");
    testEntry.Sequence = 0;
    testEntry.Owner = "somethingUniqueName";
    testEntry.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureAttribute;
    testEntry.Value = "?";
    webApp.WebConfigModifications.Add (testEntry);
}

If you noticed in Part 1 and Part 2 examples... type property of modification is different

That is because when you want to add a section inside configuration file then use EnsureChildNode and when you want to set node values which are already in configuration file then use EnsureAttribute .

Also while adding section in configuration file avoid using type as EnsureSection because sections created by using this type are permanent and cannot be removed from the configuration file.

So calling these two methods inside feature receiver will be like :

public
override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWebApplication webApplication = properties.Feature.Parent as SPWebApplication;
   
AddSafeControlEntry(webApplication);
   
ModifyAuthorization(webApplication);      webApplication.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();              
     webApplication.Update();

Small Tip:

After doing changes in configuration file one should call method

webApplication.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();           
webApplication.Update();

because by using this method changes to web.config file gets applied at farm level and also use this method call only once rather using after each addition because this method creates timer job on server so if you call this method more than once in single cycle then you might face an error like .. There is timer job already running

So best practice is to call your methods to add your changes in configuration file and then finally call this method

References: great post : http://www.crsw.com/mark/Lists/Posts/Post.aspx?ID=32
and http://blog.thekid.me.uk/archive/2007/03/20/removing-web-config-entries-from-sharepoint-using-spwebconfigmodification.aspx

Removing Entries From SharePoint Web Configuration File using SPWebConfigModification

In this section I will be explaining short code about how to remove entries from web configuration file of SharePoint using API SPWebConfigModification
in following function passing SPWebApplication and name of owner as parameters.

Then getting collection of all modifications in web configuration file and then while iterating through collection of these modifications , compare name of owner which is unique and remove that modification from collection and update web application.

private
 void RemoveTestEntry(SPWebApplication webApplication, string owner)
{
    Collection<SPWebConfigModification> allModifications = webApplication.WebConfigModifications;
    int initialCount = webApplication.Count;
    for (int i = initialCount - 1; i >= 0; i--)
    {
        SPWebConfigModification Testmodification = allModifications [i];
        if (Testmodification.Owner == owner)
            allModifications.Remove(Testmodification);
    }
    if (initialCount > allModifications.Count)
   {
        webApplication.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();               
        webApplication.Update();
    }
}

No comments:

Post a Comment