Programmaticly siga um site, mas receber um erro
Pergunta
Eu tenho um método no meu aspx.cs arquivo que deve certificar-se de que o usuário atual siga o site atual.Quando eu verificar ULS eu receber este:
FollowedContent.FollowItem:Exceção:A Microsoft.SharePoint.SPException:A validação de segurança para esta página são inválidos.Clique em Voltar no seu Navegador, atualize a página e tente a operação novamente.---> Do sistema.O tempo de execução.InteropServices.COMException:A validação de segurança esta página é inválido.Clique em Voltar no seu navegador, atualize a página e tente a operação novamente.0x8102006d
Não poderia seguir o url
http://removedlink/
e
A Microsoft.Office.Server.Social.SPSocialFollowingManager.A seguir:A Microsoft.Office.Server.UserProfiles.FollowedContentException:InternalError :Não poderia seguir o item X em A Microsoft.Office.Server.UserProfiles.FollowedContent.FollowItem(FollowedItem item, Boolean isInternal)
Meu código tenha esta aparência:
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);
}
}
});
}
Quando eu depuração esta é a exceção recebo .Execute() método:
{"A operação falhou devido a um erro interno ocorreu.Interno nome de tipo:A Microsoft.Office.Server.UserProfiles.FollowedContentException.Código de erro interno:11."}
Qualquer tipo de ajuda é bem-vinda
Solução
Primeiro, você deve apenas usar o recém-criado SPSite e SPWeb instâncias dentro RunWithElevatedPrivileges delegação.Altere a seguinte linha no seu código
SPServiceContext context = SPServiceContext.GetContext(currentsite);
a este:
SPServiceContext context = SPServiceContext.GetContext(site);
Outro problema é a validação de segurança na página, e você precisa chamar ValidateFormDigest método antes de realizar a elevação desde o seu código executa a operação de gravação.Então adicione a seguinte linha antes de SPSecurity.RunWithElevatedPrivileges no seu código:
SPUtility.ValidateFormDigest();