Posts
163
Comments
179
Trackbacks
5
SharePoint: aggiungere e rimuovere modifiche al web.config tramite feature


L’argomento è trattato in tanti post, ma personalmente ho trovato molte difficoltà a reperire le giuste informazioni e a sviluppare una soluzione pienamente funzionante. Quindi cerco di fare chiarezza per futura memoria mia e per chi ne avrà bisogno.

L’esigenza è molto semplice: modificare il web.config di SharePoint con l’aggiunta di parametri, sezioni o modificando il valore di semplici attributi. Il caso che forse più comune è quello di aggiungere parametri alla sezione <appSettings> che solitamente non è nemmeno presente nel web.config di SharePoint.

L’esempio presentato in questo post tratta proprio l’aggiunta di un parametro alla sezione <appSettings>.  Supponendo di aver già impostato la nostra feature con i vari eventi e supponendo di voler aggiunere il parametro quando la feature viene attivata e rimuoverlo quando la feature viene disattivata, dovremo prendere in considerazione i due eventi FeatureActivated e FeatureDeactivating.

In fase di attivazione il codice da eseguire sarà questo:

   1: public SPWebConfigModification createModification(String paramName, String value, String ownerID)
   2: {
   3:   SPWebConfigModification modification = new SPWebConfigModification("add[@key='" + paramName + "']", "configuration/appSettings");
   4:   modification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
   5:   modification.Value = "<add key=\"" + paramName + "\" value=\"" + value + "\" />";
   6:   modification.Sequence = 0;
   7:   modification.Owner = ownerID;
   8:   return modification;
   9: }
  10:         
  11: public override void FeatureActivated(SPFeatureReceiverProperties properties)
  12: {
  13:     SPWebApplication webApp = SPContext.Current.Site.WebApplication;
  14:     // Ripulisco le modifiche precedenti se presenti
  15:     webApp.WebConfigModifications.Clear();
  16:     // Per sezioni che includono altri figli devo usare EnsureSection.
  17:     // questo fa si che la sezione venga creata se non esistente
  18:     SPWebConfigModification modification = new SPWebConfigModification("appSettings", "configuration");
  19:     modification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureSection;
  20:     modification.Value = "appSettings";
  21:     modification.Sequence = 0;          
  22:     // In questo caso il Guid è settato ad un valore casuale in modo che la sezione non 
  23:     // sarà rimossa in fase di disinstallazione potendo essere usata da altre applicazioni
  24:     modification.Owner = Guid.NewGuid().ToString();
  25:     // Aggiungo le modifiche
  26:     webApp.WebConfigModifications.Add(modification);
  27:  
  28:     // Aggiungo un parametro 
  29:     webApp.WebConfigModifications.Add(createModification("Param1","Value1", properties.Feature.DefinitionId.ToString()));
  30:  
  31:     // Salvo le modifiche sul web.config
  32:     webApp.Update(); 
  33:     webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();           
  34: }

Da notare che come prima cosa viene creare la sezione <appSettings> se non esistente. Dato che si tratta di una sezione e dato che non vogliamo sovrascriverla se già presente utilizzeremo il tipo EnsureSection e come owner utilizzeremo um Guid generato casualmente.
Molta attenzione va fatta invece nell’aggiunta dei parametri alla sezione <appSettings>. Infatti il nome della SPWebConfigModification deve essere l’XPath che identifica univocamente il nodo all’interno della sezione padre.
Se il nome non viene impostato correttamente otterremo due side-effect:

  1. il parametro non sarà rimosso in fase di disattivazione della feature;
  2. se il parametro è già presente, verrà creato un doppione.

La rimozione delle modifiche eseguite è un’operazione molto più semplice. La funzione che sto utilizzando è quella descritta in questo post:

   1: public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
   2: {
   3:   SPWebApplication webApp = SPContext.Current.Site.WebApplication;
   4:   Collection<SPWebConfigModification> oCollection = webApp.WebConfigModifications;
   5:   int iStartCount = oCollection.Count;
   6:   // Elimino solo le modifiche inserite dalla feature corrente (verifico attraverso l'ID)
   7:   for (int c = iStartCount - 1; c >= 0; c--)
   8:   {
   9:     SPWebConfigModification oModification = oCollection[c];
  10:     if (oModification.Owner == properties.Feature.DefinitionId.ToString())
  11:       oCollection.Remove(oModification);
  12:   }
  13:   // Se è stato effettivamente eliminato qualcosa, faccio l'update
  14:   if (iStartCount > oCollection.Count)
  15:   {
  16:     webApp.Update();
  17:     SPFarm.Local.Services.GetValue<SPWebService>().ApplyWebConfigModifications();
  18:   }
  19: }

Sostanzialmente si cicla tra tutte le modifiche presenti e si rimuovono solo quelle che hanno l’owner identico all’ID della Feature corrente.
Alla prossima!

posted on mercoledì 25 febbraio 2009 16:47 Print
Comments
Gravatar
# re: SharePoint: aggiungere e rimuovere modifiche al web.config tramite feature
Romeo Pruno
25/02/2009 17:10
Ottimo esempio Alessandro anche se non ho mai ritenuto opportuno utilizzare il web config di SharePoint per memorizzare dei parametri custom. Basta pensare ad uno scenario di disaster recovery o più semplicemente ad una nuova registrazione di uno dei FrontEnd Server in ambienti NLB ... perderesti tutto. Altre soluzioni maggiormente robuste sono quelle che agiscono sul registro di sistema, proprio come fa SharePoint.
Gravatar
# re: SharePoint: aggiungere e rimuovere modifiche al web.config tramite feature
asorcinelli@hotmail.it
25/02/2009 17:21
Beh si, diciamo che in caso di front end multipli può anche essere vero (anche se basterebbe tenere sincronizzati i web.config in qualche modo).

Però ci sono altre modifiche che puoi fare solo su web.config: abilitare la sessione a livello di SharePoint, abilitare le Ajax Extension Microsoft, aggiungere un modulo HTTP custom, etc, etc.
Una feature custom, potrebbe necessitare di una o più di queste modifiche, che appunto sarebbero eseguite per forza a livello di web.config.
Quello dei parametri nell'appSettings è solo un esempio, ma indicativo perchè alla fin fine si opera sempre nello stesso modo.
Gravatar
# re: SharePoint: aggiungere e rimuovere modifiche al web.config tramite feature
Romeo Pruno
26/02/2009 17:44
ahrr queste maledette sessioni. Ajax con MOSS non fino alla 14 pls ;-)
Comments have been closed on this topic.
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS