Вопрос

Я пытаюсь открыть файл XML из моей библиотеки документов.Я запускаю код как «повышенные привилегии» в файле, который я знаю, существует.

Код, который я написал вниз, это:

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

                        }
                    }
                });
.

Когда я достигаю команды xdocument.load, я получаю исключение "401 несанкционированного" ..

Есть что-то не так с моим кодом?XDocument работает с неправильным прибилением?

Большое спасибо

Это было полезно?

Решение

Я думаю, что реализация XDocument.load (String) не поддерживает аутентифицированный запрос, чтобы получить файл XML.

Однако есть еще один способ, потому что подход, который вы принимаете, будет означать, что каждый раз, когда документ открывается два веб-запроса.

  1. , чтобы построить URL-адрес, используя объект SPFile
  2. Для доступа к объекту SPFile с использованием URL-адреса, встроенного в шаге 1.

    Как насчет вместо того, чтобы построить переменную FileRL, вы используете другую перегрузку XDocument.Load ()?На этот раз вместо пропускания URI в потоке объект.

    У вас есть вся информация, которую вам нужна и может сделать что-то подобное: -

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

    Я не пробовал код, но дайте нам знать, как вы продолжаете. Также запустите SPDisPosecheck, чтобы убедиться, что это не вызывает никаких утечек памяти.

Другие советы

Я обнаружил, что с правильными преобразованиями я могу управлять потоком, так как я в «нормальном» приложении.

Код, который я использую сейчас (и работает:

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
                            }

                        }
                    }
                });
.

Метод Саймона Дэя не работал для меня - я получаю ошибки, если я прочитал в потоке в метод XDocument.load () - «Лучший перегруженный метод соответствия для 'System.xml.linq.xdocument.load (system.xml.xmlreader) имеет некоторые недопустимые аргументы» и «Аргумент» 1 ': не может конвертировать из «System.io.Stream» на «System.xml.xmlReader»

теперь предоставлено, я пытался вытащить в файл XML, который я только что добавил в структуру папки сайта SharePoint, используя SharePoint Designer, вместо файла в библиотеке документов, но это кажется мне разница в передачеStreamreader очень важен, поскольку я смог получить его на работу при использовании метода Ziba, но он не примет поток - он только имеет варианты URI, Textreader или XMLReader (которые могут быть в форме 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
            }
        }
    });
.

Это было проверено и работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top