Les meilleures pratiques pour Courir avec élévation de la privelege
Entre les deux approches qui est préférée à exécuter avec des privilèges élevés?
Première Approche:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite curSite = new SPSite(SPContext.Current.Site.ID))
{
using (SPWeb web = curSite.OpenWeb(SPContext.Current.Web.ID))
{
try
{
web.AllowUnsafeUpdates = true;
\\ do your stuff
}
catch (Exception e)
{
}
finally
{
web.AllowUnsafeUpdates = false;
web.Dispose();
}
}
}
});
Deuxième Approche:
SPSite oSite = SPContext.Current.Site;
SPWeb oWeb = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite curSite = new SPSite(oSite.ID))
{
using (SPWeb web = curSite.OpenWeb(oWeb.ID))
{
try
{
web.AllowUnsafeUpdates = true;
\\ do your stuff
}
catch (Exception e)
{
}
finally
{
web.AllowUnsafeUpdates = false;
web.Dispose();
oWeb.Dispose();
oSite.Dispose();
}
}
}
});
De leur suspicion à jeter "Le web de cours de mise à jour a été changé par un processus externe" exception ?
- Ce genre de processus êtes-vous en train de faire? peut-être il peut y avoir quelque chose ici
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous devez faire un appel à
SPWeb.ValidateFormDigest()
ouSPUtility.ValidateFormDigest()
avant l'élévation de la code. Cela permettra de se débarrasser du dangereuse mise à jour pas autorisés à OBTENIR la demande, et d'éviter de vous pour l'installation de l'AllowUnsafeUpdate propriété.Deuxièmement, comme Nigel Whatling mentionnées, vous êtes l'élimination objet de contexte dans ton deuxième code. Vous n'avez pas à éliminer. Pour être simple, seulement disposer de l'objet que vous êtes l'instanciation de vous-même. Un code comme la vôtre peuvent causer des effets secondaires, comme les autres composants SharePoint peut exiger l'accès à SPContext.Actuel.XX objets. C'est probablement à l'origine de votre problème.
Troisièmement, que vous êtes en utilisant le construire, vous n'avez pas à appeler .Dispose() sur la variable que vous avez définie à l'aide de l'en-tête. En fait, le rôle (et en fait profiter) de l'utilisation de construire est que vous n'avez pas à prendre soin de détruire l'objet. Dès que le bloc de code de sorties, même si il y a une exception, le .Méthode dispose() est appelée sur votre objet.
Pour conclure, votre code doit être modifié pour que :
Une note de côté: pour élever un code, vous avez deux options. Celui que vous utilisez ici (appel à
SPSecurity.RunWithElevatedPrivileges
) ou de l'instanciation d'un SPSite avec le SystemAccount jeton :Cela vous permettra d'exécuter élévation de code en dehors d'une webapplication.
Vous devriez également envisager d'utiliser un utilitaire de code pour envelopper ces opérations dans un plus fonctionnel. Je suis habitué à utiliser un code comme ceci :
À l'aide de ce code, vous pouvez le faire simplement, quelque part dans votre code :
Les deux approches sont presque exactement identique. Sauf dans la deuxième approche, vous êtes également l'élimination de la SPWeb et SPSite objets du contexte actuel - quelque chose que vous ne devriez pas le faire. L'exception obtenir jeté sur un site web.Mise à jour() appel? Le problème est quelque part dans le " faire vos trucs code?