Question

J'ai un service Web personnalisé qui fonctionne dans SharePoint 2007, ainsi que SharePoint 2010. Je teste actuellement que dans SharePoint 2010 dans mon environnement de dev. J'ai un code qui fait ce qui suit:

bool allowUnsafeUpdates = web.AllowUnsafeUpdates;
try
{
    web.Properties[webPropertyBagKey] = value;
    web.AllowUnsafeUpdates = true;
    try
    {
        web.Properties.Update();
    }
    catch (Exception ex)
    {
        // Update failed likely due to security reasons, try with elevated privileges
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            using (SPSite elevatedSite = new SPSite(web.Site.ID))
            {
                using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
                {
                    bool elevatedAllowUnsafeUpdates = elevatedWeb.AllowUnsafeUpdates;
                    try
                    {
                        elevatedWeb.Properties[webPropertyBagKey] = value;
                        elevatedWeb.AllowUnsafeUpdates = true;
                        elevatedWeb.Properties.Update();
                    }
                    finally
                    {
                        elevatedWeb.AllowUnsafeUpdates = elevatedAllowUnsafeUpdates;
                    }
                }
            }
        });
    }
}
catch (Exception ex)
{
    // log exception, but don't bubble it up...
}
finally
{
    web.AllowUnsafeUpdates = allowUnsafeUpdates;
}

Avant d'entrer dans le code ci-dessus, l'objet SPWeb (Web) a été ouvert à l'aide d'une technique d'usurper l'identité du propriétaire du site en déterminant le jeton de propriétaire du site de l'utilisateur et instanciation de l'objet SPSite en fournissant à l'utilisateur jeton et obtenir le SPWeb de Là. Ainsi, les appels d'API SharePoint ont déjà des privilèges assez élevé.

Ce que je trouve que mon premier web.Properties.Update () semble fonctionner très bien si j'authentifie au service Web à l'aide d'un propriétaire du site. Toutefois, si j'authentifie au service Web à l'aide d'un utilisateur qui a simplement un accès en lecture sur le Web, mon appel web.Properties.Update () échoue. Pas trop mal, je l'avais espéré, parce que je peux courir avec des privilèges élevés (ce qui fait un RevertToSelf et fonctionne comme le pool d'applications propriétaire). Ce code fonctionne correctement, mais peu de temps après les exécute de code, le fil Abandonne lors du traitement d'autres instructions (comme le « { » après un autre bloc d'essai dans un autre code.

Les bonnes nouvelles sont que si je RunWithElevatedPrivileges juste en tout temps, alors je semble être OK. En fait attraper les feuilles de tentative originale d'un problème persistant, même si je ne rien à bouillonner.

Toute idée de ce qui se passe ici? Je crains que il y a d'autres endroits où je pourrais rencontrer ce en plus d'économie juste SPWeb.Properties.

Était-ce utile?

La solution

Vous pouvez essayer de désactiver SharePoint est intégré dans la gestion des exceptions AccessDenied qui, par défaut semblent annuler la demande actuelle et provoque souvent ThreadAbortExceptions.

SPSecurity.CatchAccessDeniedException

La définition de cette propriété sur false devrait vous permettre de gérer l'exception AccessDenied vous. Rappelez-vous de restaurer sa valeur une fois que vous avez terminé.

Autres conseils

Je l'ai rencontré une situation similaire - au moins je pense que cela pourrait l'être. La façon de le résoudre est de comprendre ce que je fais vraiment lorsque vous appelez par exemple using (SPSite elevatedSite = new SPSite(web.Site.ID)) à partir de l'intérieur d'un délégué en RunWithElevatedPrivileges.

La chose est, il semble que le délégué est en cours d'exécution sur un thread différent. Ainsi, au lieu d'utiliser web.Site.ID (qui est dans un autre thread), vous devez stocker toutes les données dont vous aurez besoin (tous les ID, etc.) dans les variables simples avant d'entrer dans le délégué. Cela devrait prendre soin du fil Abandonne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top