Siga programáticamente un sitio, pero recibe un error
Pregunta
Tengo un método en mi archivo ASPX.CS que debe asegurarse de que el usuario actual siga el sitio actual. Cuando reviso ULS, recibo esto:
SIGUIENTECONTENT.FOLOWITEM: Excepción: Microsoft.SharePoint.SpException: La validación de seguridad para esta página no es válida. Haga clic en su Navegador web, actualice la página e intente su operación nuevamente. ---> System.Runtime.Enteropservices.Compartir: la validación de seguridad Para esta página no es válido. Haga clic en el navegador web, actualice el Página, e prueba tu operación. otra vez.0x8102006d
no se pudo seguir el url
http://removedlink/
y
microsoft.office.server.social.spsocialfollowingmanager.follow: Microsoft.office.server.userProfiles.FollowedContentException: INTERNEDERROR: NO PODRÍA SIGUIENTE EL ARTÍCULO X en Microsoft.Office.Server.UserProfiles.FollowedContent.FollowItem (Siguiéndose Artículo, booleano isinternal)
Mi código se ve así:
protected void ToggleUserFollowSite(object sender, EventArgs e) { var spWeb = SPContext.Current.Web; var currentsite = SPContext.Current.Site; var currentUser = spWeb.CurrentUser.LoginName; SPSecurity.RunWithElevatedPrivileges(delegate { using (var site = new SPSite(spWeb.Site.ID)) { using (var web = site.OpenWeb(spWeb.ID)) { SPServiceContext context = SPServiceContext.GetContext(currentsite); var profile = new UserProfileManager(context); var user = profile.GetUserProfile(currentUser); var followingManager = new SPSocialFollowingManager(user, context); var actorInfo = new SPSocialActorInfo(); actorInfo.ActorType = SPSocialActorType.Site; actorInfo.ContentUri = new Uri(web.Url); followingManager.Follow(actorInfo); } } }); }
Cuando deprimo esto, esta es la excepción que recibo en el método. Sigue ():
{"La operación falló porque ocurrió un error interno. Interno escribe un nombre: Microsoft.office.server.userProfiles.FollowedContentException. Código de error interno: 11. "}
Se aprecia cualquier tipo de ayuda
Solución
Primero, solo debe usar instancias de SPSITE y SPWEB recién creadas dentro de la delegación de Privilegios de RunwitheleVented.Cambie la siguiente línea en su código
SPServiceContext context = SPServiceContext.GetContext(currentsite);
a este:
SPServiceContext context = SPServiceContext.GetContext(site);
Otro problema es la validación de seguridad en la página, y debe llamar a ValidateFormDigest Método antes de realizar la elevación ya que su código realiza la operación de escritura.Así que agregue la siguiente línea antes de SPSECURITY.RUNWITHELEVATEDPRIVIEGEPLIVIGES en su código:
SPUtility.ValidateFormDigest();