Posts
154
Comments
233
Trackbacks
6
mercoledì 25 febbraio 2009
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 @ mercoledì 25 febbraio 2009 14.47 | Feedback (4)
Crash inaspettato dell’add-in WSPBuilder in Visual Studio 2008


Ormai per me che sviluppo molto su SharePoint, l’add-in di WSPBuilder per Visual Studio 2008 è diventato un must. Lo sto usando con profitto in tanti progetti e la sua gestione del deploy a mio giudizio non ha eguali.

Comunque ieri installando l’add-in su di una nuova macchina virtuale con Visual Studio 2008 + SP1 ho riscontrato un crash inaspettato che non avevo mai incontrato su altre macchine. Sostanzialmente Visual Studio 2008 in fase di startup andava in crash sistematicamente. Disinstallando l’add-in tutto tornava a funzionare. Reinstallando, stesso errore.
Sull’event-viewer l’unico indizio riportato è il seguente:

Faulting application devenv.exe, version 9.0.21022.8, stamp 47317b3d, faulting module msenv.dll, version 9.0.21022.8, stamp 47317c00, debug? 0, fault address 0x000b4210.

Cercando su Google ho trovato sul forum del progetto su Codeplex un post in cui viene segnalato lo stesso errore, anche se viene riscontrato su Windows Server 2008 (nel mio caso il sistema operativo è Windows Server 2003). Purtroppo nel post non veniva data nessuna risoluzione.

Nel mio caso la situazione si è risolta semplicemente reinstallando Visual Studio 2008 + SP1. Non so se possa essere una risoluzione generalizzata al problema, andrebbe verificato in più casi.
Se qualcuno avesse trovato una soluzione più veloce e immediata è pregato di farsi vivo (magari sul forum del progetto per rendere la cosa pubblica).

posted @ mercoledì 25 febbraio 2009 8.53 | Feedback (0)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.
La mia foto

Logo MCAD
Logo MCTS

Visite dal 16/03/2007:

Il mio stato su Messanger: