Pregunta

Estoy tratando de abrir un archivo XML de mi biblioteca de documentos.Estoy ejecutando algún código como "privilegio elevado" en un archivo que sé existe.

El código que escribí es esto:

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

                        }
                    }
                });

Cuando llego al XDocument.Dload Command obtengo la excepción "401 no autorizada" ...

¿Hay algo mal con mi código?¿Se está ejecutando XDocument con pribileo equivocado?

Muchas gracias

¿Fue útil?

Solución

Supongo que la implementación de XDocument.load (STRING) no admite una solicitud autenticada para recuperar el archivo XML.

Sin embargo, hay otra forma en que el enfoque que está tomando significará que cada vez que se abre un documento, se están realizando dos solicitudes web.

  1. uno para construir la URL usando el objeto SPFile
  2. para acceder al objeto SPFile usando la URL incorporada en el paso 1.

    ¿Qué tal en lugar de construir la variable FILEURL usas otra sobrecarga de xDocument.load ()?Esta vez en lugar del pase URI en un objeto de arroyo.

    Tienes toda la información que necesita y podría hacer algo así: -

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

    No he probado el código, pero háganoslo saber cómo continúe. También ejecute SPDISPOSECHECT para asegurarse de que esto no esté causando ninguna fuga de memoria.

Otros consejos

Descubrí que, con las conversiones correctas, puedo administrar la transmisión, ya que estoy en una aplicación "normal".

El código que uso ahora (y funciona es:

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
                            }

                        }
                    }
                });

El método de Simon Doy no funcionó para mí: obtengo errores si leí en un transmisión en un método XDocument.load () "La mejor coincidencia de métodos sobrecargados para 'system.xml.linq.xdocument.load (System.xml.xmlReader)' tiene algunos argumentos inválidos" y "Argumento '1': No se puede convertir desde 'System.io.Stream' a 'System.xml.xmlReader'"

AHORA CUENTADO, estaba tratando de tirar de un archivo XML que acababa de agregar a la estructura de la carpeta de un sitio de SharePoint utilizando SharePoint Designer, en lugar de un archivo en una biblioteca de documentos, pero me parece la diferencia de pasar unaStreamReReader es muy importante, ya que pude ponerlo en funcionamiento cuando use el método de Ziba, pero no aceptaría un flujo, solo tiene opciones de URI, TexTeader o XMLReader (que pueden ser en forma de un lector de flujo).

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

Esto ha sido probado y funciona.

Licenciado bajo: CC-BY-SA con atribución
scroll top