Question

J'essaie d'ouvrir un fichier XML de ma bibliothèque de documents.Je gère un code comme "privilège élevé" sur un fichier que je connais existe.

Le code que j'ai écrit est-ce:

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

                        }
                    }
                });

Lorsque j'atteigne la commande xdocument.load, je reçois l'exception "401 non autorisée".

Y a-t-il quelque chose qui ne va pas avec mon code?Xdocument fonctionne-t-il avec le mauvais pribilege?

Merci beaucoup

Était-ce utile?

La solution

Je suppose que la mise en œuvre de xdocument.load (String) ne prend pas en charge une demande authentifiée pour extraire le fichier XML.

Cependant, il existe une autre solution car l'approche que vous prenez signifie que chaque fois qu'un document est ouvert deux demandes Web sont en cours de réalisation.

  1. un pour construire l'URL à l'aide de l'objet SPFILE
  2. Pour accéder à l'objet SPFILE à l'aide de l'URL construite à l'étape 1.

    Que diriez-vous au lieu de construire la variable FILLERL, vous utilisez une autre surcharge du xdocument.load ()?Cette fois au lieu de l'URI pass dans un objet de flux.

    Vous avez toutes les informations dont vous avez besoin et pourriez faire quelque chose comme ceci: -

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

    Je n'ai pas essayé le code mais laissez-nous savoir comment vous y êtes. Exécutez également SPDisposecheck pour vous assurer que cela ne provoque aucune fuite de mémoire.

Autres conseils

J'ai découvert que, avec les bonnes conversions, je peux gérer le flux que je suis dans une application "normale".

Le code que j'utilise maintenant (et fonctionne est:

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
                            }

                        }
                    }
                });

La méthode de Simon Doy n'a pas fonctionné pour moi - j'ai des erreurs si je lisais dans un flux dans une méthode xdocument.load () - "La meilleure correspondance de méthode surchargé pour 'system.xml.linq.xdocument.load (system.xml.xmlreader)" a des arguments invalides "et "Argument '1': impossible de convertir de 'system.io.stream' en 'system.xml.xmlreader'"

Maintenant accordé, j'essayais de tirer dans un fichier XML que je venais d'ajouter à la structure de dossiers d'un site SharePoint à l'aide de SharePoint Designer, au lieu d'un fichier dans une bibliothèque de documents, mais cela me semble que la différence de passageStreamRireder est très important, car j'ai pu le faire fonctionner lors de l'utilisation de la méthode de Ziba, mais cela n'accepterait pas de flux - il n'a que des options URI, TEXTREADER ou XMLReader (pouvant être sous la forme d'un streamerader).

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

Ceci a été testé et fonctionne.

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