Eccomi qui a scrivere un bel post sui Commenti di SharePoint, che mi ha fatto tribolare per un pò ma che alla fine sono riuscito a svangarla (direi come al solito :P).
In un ambiente enterprise dove la security trimming è attivata potremmo avere qualche difficoltà con alcuni oggetti "social" di SharePoint, in particolare io mi sono scontrato con il metodo GetComments dell'oggetto SocialCommentManager, perchè? Perchè avevo la necessità di far visualizzare a livello pubblico i commenti inseriti su una determinata Uri dagli utenti della intranet che sto sviluppando. Il risultato era che sul mio ambiente di sviluppo, come al solito, tutto fila liscio, mentre una volta fatto il deploy dal cliente...succedeva che ogni utente vedeva i propri commenti :( azz!
Il seguente snippet riporta il modo con cui richiamavo il metodo GetComments:
SPWeb web = SPContext.Current.Web;
SPServiceContext context = SPServiceContext.Current;
Uri uri =
new
Uri(web.Url + pageUrl);
SocialCommentManager cm =
new
SocialCommentManager(context);
SocialComment[] commenti = cm.GetComments(uri);
Ma non finisce qui, dopo che ho certificato che il codice era giusto ma il risultato atteso non era esatto, provo con il web service di SharePoint e quindi altro snippet:
SocialDataService sds =
new
SocialDataService();
Microsoft.Office.Server.SocialData.SocialDataService.SocialCommentDetail[] comments = sds.GetCommentsOnUrl(
string
.Concat(SPContext.Current.Site.Url, pageUrl),
null
,
null
,
null
);
Niente, sempre lo stesso risultato :(
Bene, disassembliamo e vediamo che cosa fanno i metodi e faccio una scoperta che mi lascia stupefatto. C'è un bel metodo INTERNAL ..... GetComments che accetta un parametro bool needSecurityTrim e ora?
Sia lodata la Reflection, con l'ultimo snippet potrete avere la soluzione ai vostri problemi, senza dover ricorrere a disabilitare il Security Trimming via PowerShell:
var type =
typeof
(SocialCommentManager);
var methods = type.GetMethods(System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var method = methods.FirstOrDefault(m => m.ToString() ==
"Microsoft.Office.Server.SocialData.SocialComment[] GetComments(System.Uri, Int32, Int32, System.DateTime, Boolean)"
);
if
(method ==
null
)
throw
new
MissingMethodException(
"Social GetComment method not found."
);
var comments = method.Invoke(cm,
new
object
[] { uri, 10000, 0, DateTime.MinValue,
false
})
as
SocialComment[];