Utilizzo di tag di social networking in SharePoint 2010
Articolo originale pubblicato giovedì 29 settembre 2011
NOTA: per ottenere un documento di Word contenente questo post di blog in formato leggibile, potete scaricare l'allegato.
Di recente ho ricevuto una richiesta interessante da un utente che essenzialmente chiedeva aiuto per eseguire la migrazione di tag di social networking tra due farm diverse. Esistono alcuni elementi predefiniti che possono aiutarvi a raggiungere questo scopo e alcuni aspetti che sono allettanti, ma non ancora sufficienti.
Ho testato la procedura per ottenere i tag di social networking senza alcun tipo di rappresentazione effettiva. Nel mio caso ha funzionato, ma non posso garantire che funzioni in tutti i casi poiché avevo eseguito l'accesso come amministratore dell'applicazione profilo utente. Qualora non funzionasse, potreste utilizzare la stessa tecnica di rappresentazione che descriverò di seguito. Per ottenere i tag per un utente, ho provato semplicemente a creare un contesto SPSite accedendo come tale utente, quindi ho creato tutti gli oggetti di contesto necessari per recuperare i tag per tale utente, nel modo seguente:
SPUserToken sut = null;
//get the user token for user first so we can
//use that to get a site context as that user
using (SPSite userSite = new SPSite(UrlTxt.Text))
{
using (SPWeb rootWeb = userSite.RootWeb)
{
SPUser socialUser =
rootWeb.EnsureUser(AccountTxt.Text);
sut = socialUser.UserToken;
}
}
//now get the site as that user – NOTE: these are
//all class scoped variables
using (SPSite newSite = new SPSite(UrlTxt.Text, sut))
{
sc = SPServiceContext.GetContext(newSite);
stm = new SocialTagManager(sc);
upm = new UserProfileManager(sc);
up = upm.GetUserProfile(AccountTxt.Text);
}
Quando sono disponibili i contesti creati rappresentando l'utente corrente, è molto semplice ottenere i tag per tale utente:
SocialTag[] tags = stm.GetTags(up);
TagLst.Items.Clear();
foreach (SocialTag tag in tags)
{
TagLst.Items.Add(tag.Term.Name + " - " + tag.Url.ToString());
}
Questa parte è abbastanza semplice e intuitiva, mentre la creazione di un tag di social networking per un utente diverso sfortunatamente non è stato altrettanto semplice. SocialTagManager include un metodo AddTag, ma non offre un overload che includa un UserProfile come nel caso del metodo GetTags. Questo è un compito arduo e sfortunatamente utilizzare il contesto dell'utente che è stato passato nel nuovo costruttore SPSite non è di aiuto. Dovete quindi utilizzare la rappresentazione per risolvere la situazione. In questo caso ho semplicemente riutilizzato l'approccio che avevo descritto in questo post di blog https://blogs.msdn.com/b/sharepoint_it/archive/2011/10/07/utilizzo-di-attestazioni-saml-sharepoint-wcf-attestazioni-per-il-servizio-token-windows-e-delega-vincolata-per-l-accesso-a-sql-server.aspx. Ho configurato CTWTS in modo da consentirmi di rappresentare gli utenti, poiché la mia applicazione era in esecuzione nel contesto del mio utente. Potete trovare dettagli specifici sulla procedura che ho adottato in questo articolo: https://msdn.microsoft.com/en-us/library/ee517258.aspx.
Tenendo presente tale approccio, ho gestito inizialmente gestito la rappresentazione come segue:
//start the impersonation
//create the WindowsIdentity for impersonation
WindowsIdentity wid = null;
try
{
wid = S4UClient.UpnLogon(EmailTxt.Text);
}
catch (SecurityAccessDeniedException adEx)
{
MessageBox.Show("Could not map the Email to " +
"a valid windows identity: " + adEx.Message);
}
//see if we were able to successfully login
if (wid != null)
{
using (WindowsImpersonationContext ctx = wid.Impersonate())
{
//code goes here to add a new tag
}
}
else
{
MessageBox.Show("Couldn't impersonate user - can't add tag.");
}
Il codice di rappresentazione non è particolarmente complesso, vi serve solo l'indirizzo di posta elettronica dell'utente, che potete probabilmente ottenere dal profilo utente recuperato da questo codice. È inoltre necessario che CTWTS, componente installato in ogni server SharePoint, sia in esecuzione e questo codice deve essere eseguito in un server SharePoint poiché utilizza il modello a oggetti. Anche in questo caso non si tratta di una procedura complicata.
Per aggiungere infine il nuovo tag per l'utente è necessario eseguire alcuni passaggi abbastanza semplici. Il codice ha l'aspetto seguente:
//this is the code that gets the SPSite, SPServiceContext, etc
GetServiceContext();
//work with the taxonomy classes so we
//can reuse any existing term, or create a
//new one if it doesn't exist
TaxonomySession txs = stm.TaxonomySession;
TermStore ts = txs.DefaultKeywordsTermStore;
TermCollection terms =
ts.KeywordsTermSet.GetTerms(TagTxt.Text,
ts.DefaultLanguage, true);
Term t = null;
if (terms.Count == 0)
{
t = ts.KeywordsTermSet.CreateTerm(TagTxt.Text,
ts.DefaultLanguage);
ts.CommitAll();
}
else
t = terms[0];
//add the tag
stm.AddTag(new Uri(TagUrlTxt.Text), t);
In questo caso esaminiamo semplicemente l'archivio della tassonomia per cercare il tag che è stato aggiunto. Se lo troviamo procediamo a utilizzarlo, in caso contrario lo creiamo e lo aggiungiamo all'archivio termini. Aggiungiamo quindi il termine e lo associamo a un URL, in questo modo verrà aggiunto ai tag di social networking di tale utente.
Nel complesso il codice e l'approccio sono piuttosto intuitivi. Il problema principale in questo caso consiste solo nell'impossibilità di specificare a quale utente deve essere aggiunto il tag di social networking. Il codice di rappresentazione e CTWTS assolvono a tale compito per noi senza richiedere la password per ogni utente. Il codice sorgente per questo progetto è allegato al post di blog.
Questo è un post di blog localizzato. L'articolo originale è disponibile in Working with Social Tags in SharePoint 2010