Domanda

Sto cercando di aprire un file XML dalla mia libreria di documenti.Sto eseguendo un codice come "elevato privilegio" su un file che conosco esiste.

Il codice che ho scritto è questo:

 SPSecurity.RunWithElevatedPrivileges(() =>
                {
                    using (SPSite sito = new SPSite("SITE URL"))
                    {
                        using (SPWeb web = sito.OpenWeb())
                        {
                            SPList lista = web.Lists.TryGetList("DOCUMENT LIBRARY NAME");

                            foreach (SPFile file in lista.RootFolder.Files)
                            {
                                String fileUrl = web.Url + "/" + lista.RootFolder.Url + "/" + file.Url;
                                var ret = XDocument.Load(fileUrl);
                            }

                        }
                    }
                });
.

Quando raggiungo il comando xDocument.load ottengo l'eccezione "401 non autorizzata" ..

C'è qualcosa di sbagliato nel mio codice?XDocument è in esecuzione con Pribilege sbagliato?

Grazie mille

È stato utile?

Soluzione

Immagino che l'implementazione di xDocument.load (stringa) non supporti una richiesta autenticata per recuperare il file XML.

Tuttavia, c'è un altro modo perché l'approccio che stai assumendo significherà che ogni volta che viene aperto un documento, vengono apportate due richieste web.

    .
  1. uno per costruire l'URL usando l'oggetto spfile
  2. Per accedere all'oggetto Spfile utilizzando l'URL integrato nel passaggio 1.

    Che ne dici di creare la variabile FileURL utilizza un altro sovraccarico di XDocument.load ()?Questa volta invece del passaggio URI in un oggetto Stream.

    Hai tutte le informazioni di cui hai bisogno e potresti fare qualcosa del genere: -

    SPFileCollection filesInFolder = lista.RootFolder.Files;
    foreach(SPFile file in filesInFolder)
    {
        using(Stream fileStream = file.OpenBinaryStream())
        {
             XDocument xmlDocument = XDocument.Load(fileStream);
             fileStream.Close()
        }
    }
    
    .

    Non ho provato il codice ma facci sapere come vai avanti. Esegui anche Spdisposposcheck per assicurarsi che questo non stia causando alcuna perdita di memoria.

Altri suggerimenti

Ho scoperto che, con le conversioni giuste, posso gestire il flusso come sono in un'app "normale".

Il codice che uso ora (e funziona è:

SPSecurity.RunWithElevatedPrivileges(() =>
                {
                    using (SPSite sito = new SPSite("SITE URL"))
                    {
                        using (SPWeb web = sito.OpenWeb())
                        {
                            SPList lista = web.Lists.TryGetList("DOCUMENT LIBRARY NAME");

                            foreach (SPFile file in lista.RootFolder.Files)
                            {
                                MemoryStream mStream = new MemoryStream(file.OpenBinary());
                                StreamReader reader = new StreamReader(mStream, true);
                                XDocument documento = XDocument.Load(reader, LoadOptions.None);
                                //MY CODE
                            }

                        }
                    }
                });
.

Il metodo Simon Doy non ha funzionato per me - ottengo errori se ho letto in un flusso in un metodo XDocument.load () - "La migliore corrispondenza del metodo sovraccaricata per 'system.xml.linq.xdocument.load (system.xml.xmlReader)' ha alcuni argomenti non validi" e "Argomento" 1 ': non può convertire da' system.io.stream 'a' system.xml.xmlReader '"

Ora concesso, stavo cercando di tirare un file XML che avevo appena aggiunto alla struttura delle cartelle di un sito di SharePoint utilizzando SharePoint Designer, anziché un file in una libreria di documenti, ma mi sembra la differenza di passare aStreamReader è molto importante, dal momento che sono stato in grado di farlo funzionare quando usi il metodo di Ziba, ma non accetterebbe un flusso: ha solo URI, TexTreader o Opzioni XMLReader (che possono essere sotto forma di un StreamReader). .

string siteUrl = SPContext.Current.Site.Url;
string xmlpath = siteUrl + @"/includes/XML/myFile.xml";
SPSecurity.RunWithElevatedPrivileges(delegate() 
    {
        using (SPSite site = new SPSite(siteUrl))
        {
            using (SPWeb web = site.OpenWeb())
            {
                SPFile file = web.GetFile(xmlpath);
                MemoryStream mStream = new MemoryStream(file.OpenBinary());
                StreamReader reader = new StreamReader(mStream, true);
                XDocument doc = XDocument.Load(reader, LoadOptions.None);
                //MY CODE
            }
        }
    });
.

Questo è stato testato e funziona.

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