Использование C# для доступа к OneDrive для бизнеса (Office365) — невозможно перечислить вложенные папки

В целях резервного копирования (поскольку пользователи прекрасно умеют случайно удалять то, чего не должны), я пытаюсь написать какое-то программное обеспечение для загрузки содержимого пользователей моей компании «One Drives» в сеть компании, чтобы мы могли сделать их резервную копию на случай они удаляют что угодно.

В настоящее время я использую для этого Microsoft.SharePoint.Client. У меня также сложилось впечатление, что OneDrive для бизнеса достаточно отличается (с его запутанностью в Sharepoint) от OneDrive.

Например... если мой URL-адрес OneDrive — https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents/

Я могу успешно перечислить все папки в корне папки «Документы» и загрузить все файлы в корне папки «Документы».

Вот пример списка папок в Documents.

public void Listfiles()
{
    var folders = ListFolders(dirPath, clientContext, web);
    // now do something with results contained in 'folders'
}

public List GetDocumentLibrary(string libraryName, ClientContext clientContext, Web web)
{
    var query = clientContext.LoadQuery(web.Lists.Where(p => p.Title == libraryName));
    clientContext.ExecuteQuery();
    return query.FirstOrDefault();
}

public List<Folder> ListFolders(string libraryName, ClientContext clientContext, Web web)
{
    var list = GetDocumentLibrary(libraryName, clientContext, web);
    var folders = list.RootFolder.Folders;
    clientContext.Load(folders);
    clientContext.ExecuteQuery();
    return folders.ToList();
}

Этот код отлично работает для возврата списка папок в папке «Документы», однако моя проблема заключается в попытке вывести содержимое одной из этих папок.

например https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents/PurchaseRequests/

Если я попытаюсь запустить тот же код, что и выше, на этот раз я получу следующее исключение.

An unhandled exception of type 'Microsoft.SharePoint.Client.ClientRequestException'      occurred in Microsoft.SharePoint.Client.dll

Additional information: Cannot contact site at the specified URL 
https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents. 
There is no Web named "/personal/firstname_lastname_mycompany_com/Documents/_vti_bin/sites.asmx"

Это происходит в операторе ExecuteQuery() в GetDocumentLibrary(), я не понимаю, почему он не возвращает никаких результатов, поскольку я изменил клиентский контекст и веб-сайт, чтобы указать на новый URL-адрес для запроса вместо того, который указывает у документов.

Кто-нибудь знает, почему он ищет /_vti_bin/sites.asmx, если да, то есть ли у кого-нибудь предложения относительно того, где я ошибаюсь?

Правильно ли я это делаю? Есть ли что-то, что мне не хватает, когда речь идет о подпапках в Sharepoint/OneDrive для бизнеса? Это какая-то странность Microsoft?

Огромное спасибо

Дуги


person FridgeMagnet    schedule 28.04.2014    source источник


Ответы (1)


Вы получаете эту ошибку, потому что вы должны передавать URL-адрес библиотеки документов OneDrive для бизнеса в клиентский контекст, а не URL-адрес своего сайта OneDrive для бизнеса.

Например. вы, вероятно, делаете это:

new ClientContext("https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/Documents/")

Когда вы должны это делать:

new ClientContext("https://accountname-my.sharepoint.com/personal/firstname_lastname_mycompany_com/")

Обратите внимание, что часть URL-адреса «Документы» — это библиотека документов, а не сайт. Вы должны передать URL-адрес сайта в новый ClientContext(). Вот почему вы получаете ошибку.

Чтобы перечислить все папки, вам нужно выполнить небольшую рекурсию или что-то подобное. Как только вы получите этот первоначальный список корневых папок, для каждой папки в этом списке выполните:

clientContext.Load(folder.Folders);
clientContext.ExecuteQuery();

Затем для каждой возвращенной папки сделайте то же самое и т. д., пока не получите полный список папок.

person McGeeky    schedule 28.04.2014
comment
Спасибо большое, благодаря вашей помощи у меня все в голове. Это сводило меня с ума на пару дней! - person FridgeMagnet; 29.04.2014