In un’architettura articolata di Farm Sharepoint, l’esigenza di eseguire il ContentDeployment è piuttosto comune. Spostare contenuti da una Site Collection ad un’altra, eseguire una migrazione di contenuti parziali, oppure solo di contenuti approvati.
Lo scenario che possiamo immaginare è il seguente: abbiamo un Publishing Site Portal di Sharepoint in cui abbiamo pubblicati una serie di posting, pagine ecc… Tale portale è disponibile a livello intranet e quindi accessibile ad un’utenza selezionata secondo le policy e i criteri di Sharepoint.
Abbiamo però la necessità di avere una replica parziale di tale Publishing Site Portal, in cui soltanto alcuni articoli siano resi visibili su internet (avremo quindi accesso Anonymous impostato sulla nostra Web Application).
Il ContentDeployment messo a disposizione a livello di Central Administration sottintende che un utente Approver o Writer non sia abilitato ad eseguire questo tipo di operazioni: scriveremo quindi un’applicazione richiamabile da una CustomPage all’interno del sito e che andrà a generare il pacchetto necessario al ContentDeployment. Una volta eseguito l’export della nostra site collection (oppure di una List, o di un Web) andremo, sempre tramite le Api di Sharepoint a importare il contenuto nella SiteCollection di destinazione.
Nel nostro scenario avremo i seguenti step
1) L’Editor del sito realizza l’uscita del nostro giornale on line a livello intranet (step autonomo che esula dal Content Deployment)
2) L’Editor richiama una pagina che genera l’export dell’intera SiteCollection. La cartella dell’Export verrà salvata sul FileSystem
3) Avremo un programma batch che ogni x minuti controllerà se ci sono nuovi esport da pubblicare: nel momento in cui troverà un export disponibile andrà ad eseguire l’import per poi andre a cancellare la cartella su FileSystem.
Procedura di Export del SPSite principale
Dopo aver recuperato l’intera Site Collection e il relativo SPWeb definiamo l’oggetto SPExportObject e gli assegnamo come id l’ID del SPWeb che vogliamo andare ad esportare. Da prestare particolare attenzione all’enumeration SPIncludeDescendant i cui valori possono essere:
All Specifies that all descendants of the parent object, including nested generations, are exported.
Content Specifies that only the direct descendants of the parent object are exported.
None Specifies that no descendants of the parent object are exported.
Il Type del nostro exportObject sarà chiaramente un Web. Al momento della navigazione dei singoli item e liste del SPWeb corrente andrà impostato il valore corretto.

Nel nostro caso salviamo a livello di file system tutto l’export valorizzando la proprietà FileLocation.
Indichiamo anche tramite la proprietà ExcludeDependecies che ogni file, se esportato, porti con sé anche tutte le dipendenze correlate (es. le immagini). A questo punto aggiungiamo alla Collection ExportObjects della classe SPExportSettings il primo elemento in questione, cioè l’SPWeb. Questa operazione andrà fatta per ogni elemento che si desidera esportare.
Procedura di Export degli SPSite figli
Adesso andiamo a scorrere PortalListItemSiteMapNode tutti i siti figli del SPWeb root, al fine di andare ad esportare tutto.

Nell’esempio abbiamo una funzione che converte un SiteMapNode in SPWeb (qui sotto elencata). La scelta di usare il PortalListItemSiteMapNode è dovuta al fatto che gli Editor hanno la possibilità di scegliere l’ordine in cui visualizzare sia i siti internet che gli articoli e le pagine al loro interno.
La funzione GetElevatedSite consente di ricavare la SiteCollection anche se l’utente corrente non un SiteCollection Admin.
Procedura di Export delle liste di ogni SPSite
E’ opportuno dislocare la parte di codice sopra indicata così come quella seguente in funzioni o classi esterne per poi andare ad eseguirle in modo ricorsivo. Nel nostro scenario non sappiamo a priori quanti sono gli SPSite che un SPSite padre può contenere.
Il codice seguente è previsto inserito all’interno del loop che analizza gli SPSite figli del sito Root. Andremo a scorrere tutte le List in essi contenuti ed ad esportare as is le Lists di sistema, cioè tutte le liste che non sono Pagine (Pages in inglese) e Immagini (Images). Nel nostro scenario Moss è e rimarrà sempre in italiano. E’ necessario una customizzazione a seconda le proprie esigenze.
Prima di terminare il loop per passare al SPWeb successivo è opportuno richiamare scorrere tutti i Childs del CurrentWeb in modo ricorsivo. L’obbiettivo è alimentare la collection ExportObjects dell’oggetto SPExportSettings.
Procedura di Export degli SPListItem di ogni SPList
Una volta inserite nella collection le SPList del nostro SPWeb andremo a scegliere gli item che l’Editor ha selezionato come pubblicabili a livello Internet. Per fare questo abbiamo creato una funziona apposita e, per individuare il campo che ci indichi se la pagina è esportabile ci riferiamo ad un campo Custom creato in un apposito ContenType distribuito separatamente tramite una feature.
In questa porzione di codice recuperiamo “in chiaro” sia la lista relativa alle pagine che la pagina di default. Tale scelta è chiaramente dovuta allo scenario corrente, scelta che può non essere opportune in altri scenario in cui si deve applicare maggiore parametrizazzione alle funzioni per recuperare tali elementi.
Esecuzione del Run di Export
Una volta eseguito il loop completo all’interno della nostra SiteCollection avremo l’istanza del nostro oggetto SPExportSettings valorizzato interamente con ciò che vogliamo esportare.
La creazione del file di export non è cosa scontata, soprattutto, quando i siti, sottositi ecc… sono numerosi. Per quanto possa essere noioso è fortemente consigliato di eseguire in debug almeno un giro completo in fase di export. Se per esempio abbiamo inserito nella collection un SPListItem oppure una SPList e non il suo Parent di riferimento la procedura di Import andrà in errore.
Necessario sempre eseguire la Dispose dei vari SPWeb e SPSiteCollection instanziate. Sharepoint non la esegue al nostro posto. Se questa dovesse essere messa il server verrebbe messo “seduto” in veramente poco tempo.
Abbiamo adesso salvato correttamente (lo speriamo tutti!) nel percorso indicato sopra una cartella con tutte le info necessarie per andare ad eseguire l’import. Ci accingiamo quindi a scrivere un programma che, in modo autonomo, andrà ad importare nella SiteCollection di destinazione tutto il materiale.
Procedura di Import nella SiteCollection di destinazione
Nel nostro scenario in produzione abbiamo creato un programma che con un Timer verifica la presenza della cartella di Export. Nel caso in cui sia stato creato un export questo viene importato e poi eliminato dal FileSystem. La procedura di import è relativamente semplice in quanto si assume che l’export sia stato correttamente eseguito.
Di seguito vediamo un piccolo programma batch che esegue in test l’import del nostro Sito.
Abbiamo così permesso ad un utente Editor di eseguire l’export completo di un sito Sharepoint filtrando gli item in base a criteri decisi dall’editor stesso.