Domanda

Ho un servizio Web personalizzato che viene eseguito in SharePoint 2007 e SharePoint 2010. Attualmente sto testando solo in SharePoint 2010 nel mio ambiente dev. Ho qualche codice che fa il seguente:

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;
}

Prima di arrivare al codice di cui sopra, l'oggetto SPWeb (web) è stato aperto utilizzando una tecnica di impersonare il proprietario del sito determinando utente del proprietario del sito token e istanziare l'oggetto SPSite fornendo all'utente token e ricevendo lo SPWeb da Là. Quindi, le chiamate alle API di SharePoint già hanno abbastanza privilegi elevati.

Quello che ho trovato è che il mio primo web.Properties.Update () sembra funzionare bene se l'autenticazione al servizio Web utilizzando un proprietario del sito. Tuttavia, se l'autenticazione al servizio Web utilizzando un utente che ha accesso in lettura solo al web, il mio web.Properties.Update () chiamata non riesce. Non troppo male, avevo sperato, perché posso solo correre con privilegi elevati (che fa un RevertToSelf e corre come il proprietario del pool di applicazioni). Questo codice funziona correttamente, ma poco dopo l'esecuzione della codice, i Aborts filo durante l'elaborazione di alcune altre istruzioni (come il "{" dopo l'altro blocco try in qualche altro codice.

La buona notizia è che se ho appena RunWithElevatedPrivileges in ogni momento, poi mi sembrano essere OK. Fondamentalmente cattura le foglie originale tentativo di un problema persistente, anche se io non bolla nulla fino.

Qualche idea di cosa sta succedendo qui? Sono interessato che ci sono altri posti in cui ho potuto incorrere in questo SPWeb.Properties oltre solo di risparmio.

È stato utile?

Soluzione

Si potrebbe desiderare di provare a disattivare SharePoint incorporato nella gestione di eccezioni AccessDenied che di default sembrano annullare la richiesta corrente e spesso causa ThreadAbortExceptions.

SPSecurity.CatchAccessDeniedException

L'impostazione di questa proprietà su false dovrebbe consentire di gestire l'eccezione AccessDenied da soli. Ricordarsi di ripristinare il suo valore una volta che si è fatto.

Altri suggerimenti

ho incontrato una situazione simile - almeno credo che questo potrebbe essere essa. Il modo per risolverlo è stato quello di capire quello che sto facendo davvero quando si chiama per esempio using (SPSite elevatedSite = new SPSite(web.Site.ID)) da dentro un delegato in RunWithElevatedPrivileges.

La cosa è, a quanto pare il delegato è in esecuzione su un thread diverso. Così, invece di usare web.Site.ID (che è in un altro thread), è necessario memorizzare tutti i dati di cui ha bisogno (tutti gli ID, ecc) a variabili semplici prima di entrare il delegato. Questo dovrebbe prendersi cura dei Aborts filo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top