Оптимизируйте время загрузки CSOM, чтобы получить все файлы из дерева SharePoint

#c# #sharepoint #csom

#c# #sharepoint #csom

Вопрос:

итак, я пытаюсь реализовать функцию для получения всех файлов из дерева SharePoint. Функция работает нормально, за исключением времени ее загрузки.

Вот что я сделал

     private List<ListItem> GetAllItems(ClientContext Context, List list, List<ListItem> ListItems, CamlQuery camlQuery)
        {
            camlQuery.ViewXml =
                    @"< View Scope = 'RecursiveAll'>
                        < Query >
                            <Where>
                          </Where>
                        </ Query >
                    </ View >";

            ListItemCollection AllItems = list.GetItems(camlQuery);
            Context.Load(AllItems);
            Context.ExecuteQuery();
            foreach (ListItem item in AllItems)
            {
                if (item.FileSystemObjectType == FileSystemObjectType.File)
                {
                    if (!ListItems.Contains(item))
                        ListItems.Add(item);
                }

                if (item.FileSystemObjectType == FileSystemObjectType.Folder)
                {
                    camlQuery.FolderServerRelativeUrl = item.FieldValues["FileRef"].ToString();
                    GetAllItems(Context, list, ListItems, camlQuery);
                }
            }

            return ListItems;
        }
  

Проблема Context.ExecuteQuery(); в том, что загрузка каждого запроса занимает у меня от 0,3 до 1 секунды, а для дерева, в котором у меня 1424 папки, загрузка заняла более 4 минут, и это было бы слишком долго, если бы количество папок увеличилось.

Итак, я хочу спросить, есть ли какая-либо возможность сократить время загрузки этого или в любом случае более оптимально получать все файлы из дерева SharePoint?

Ответ №1:

Это статья об оптимизации кода CSOM для справки: https://www.codeproject.com/Articles/738008/Programming-Efficiently-with-the-SharePoint-Client

Основная идея:

  1. Запрашивайте только то, что вы хотите (но запрашивайте все, что хотите, за один раз!)
  2. Вызывайте ExecuteQuery экономно
  3. Дополнительно: параллельный и асинхронный код
  4. Кэширование данных в сеансе