Получить документы/файлы с диска Share Point

У нас есть несколько сайтов SharePoint, и наше приложение зарегистрировано в домене. В настоящее время мы пытаемся получить документы из SharePoint, используя идентификатор клиента и секретный ключ, но столкнулись с проблемами. Мы использовали GraphClient, но получили пустые объекты для корня, дисков и списков элементов. Мы также позаботились о том, чтобы все разрешения предоставлялись на уровне приложения. Вот фрагмент кода: (код, разработанный в .net 8, и мы использовали последний пакет Microsoft.Identity.Client Nuget)

public async Task<string> GetAccessTokenAsync()
{
    string[] scopes = { "https://graph.microsoft.com/.default" };

    var clientSecretCredential = new ClientSecretCredential(
            tenantId, clientId, clientSecret);

    var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

    // Retrieve the files from the "My Files" folder (OneDrive root)

    var document = await graphClient.Users["[email protected]"].GetAsync();

    var driveItems = await graphClient.Sites["XXXX-my.sharepoint.com"].GetAsync();

    
    foreach (var items in document.Drive.Items)
    {
        Console.WriteLine(items.Name);
    }
}

Как мы можем получить все документы «Мои файлы» с помощью Microsoft Graph?

Попробуйте https://graph.microsoft.com/v1.0/Users/UserId/drive/root/chi‌​ldren

Rukmini 25.07.2024 12:34

фрагмент кода, который мы предоставили ранее. См. изображение диска SharePoint. Нам нужно получить документы, которые загружены на диск. Вот тестовое изображение, которое мы загрузили и которое нужно получить с помощью Graph API.

Pooja Parmar 25.07.2024 12:41

Вы пробовали вышеуказанный API?

Rukmini 25.07.2024 12:47

Да, мы пробовали, но DRIVE получил ноль.

Pooja Parmar 25.07.2024 12:53

Хорошо, проверю и обновлю

Rukmini 25.07.2024 12:54

Попробуйте https://graph.microsoft.com/v1.0/users/UserID/drives/DriveID‌​/root/children

Rukmini 25.07.2024 13:05

graph.microsoft.com/v1.0/Users/UserId/drive/root/children это работает в POSTMAN, но не на уровне кода.

Pooja Parmar 25.07.2024 13:09

Вы хотите использовать только GraphClient или вы можете разобрать https-запрос в коде и получить результат?

Rukmini 25.07.2024 13:14

Мы использовали GraphServiceClient.

Pooja Parmar 25.07.2024 13:16

Проверьте это, если с вами все в порядке, я опубликую ответ с полным кодом

Rukmini 25.07.2024 13:16

Да, меня это устраивает.

Pooja Parmar 25.07.2024 13:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В OneDrive мои файлы в моей среде выглядят следующим образом:

Используйте приведенный ниже код, чтобы получить все «Мои файлы» с помощью Microsoft Graph:

namespace GraphApiDemo
{
    class Program
    {
        private static string tenantId = "TenantID";
        private static string clientId = "ClientID";
        private static string clientSecret = "ClientSecret";
        private static string userId = "UserID";
        private static string driveId = "DriveID"; 

        public static async Task Main(string[] args)
        {
            try
            {
                var token = await GetAccessTokenAsync();
                await RetrieveDriveItemsAsync(token);
            }
            catch (Exception ex)
            {
                Console.WriteLine("An error occurred: " + ex.Message);
            }
        }

        public static async Task<string> GetAccessTokenAsync()
        {
            var scope = "https://graph.microsoft.com/.default";
            var authority = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";

            using (var client = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Post, authority);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

                var content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("grant_type", "client_credentials"),
                    new KeyValuePair<string, string>("client_id", clientId),
                    new KeyValuePair<string, string>("client_secret", clientSecret),
                    new KeyValuePair<string, string>("scope", scope)
                });
                request.Content = content;

                var response = await client.SendAsync(request);
                response.EnsureSuccessStatusCode();

                var responseContent = await response.Content.ReadAsStringAsync();
                var tokenResponse = JsonDocument.Parse(responseContent);
                var accessToken = tokenResponse.RootElement.GetProperty("access_token").GetString();
                return accessToken;
            }
        }

        public static async Task RetrieveDriveItemsAsync(string accessToken)
        {
            using (var client = new HttpClient())
            {
                var url = $"https://graph.microsoft.com/v1.0/users/{userId}/drives/{driveId}/root/children";
                var request = new HttpRequestMessage(HttpMethod.Get, url);
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

                var response = await client.SendAsync(request);

                if (!response.IsSuccessStatusCode)
                {
                    var errorContent = await response.Content.ReadAsStringAsync();
                    Console.WriteLine($"Error: {response.StatusCode} - {response.ReasonPhrase}");
                    Console.WriteLine("Response content:");
                    Console.WriteLine(errorContent);
                    return;
                }

                var responseContent = await response.Content.ReadAsStringAsync();

                using (JsonDocument doc = JsonDocument.Parse(responseContent))
                {
                    JsonElement root = doc.RootElement;
                    JsonElement items = root.GetProperty("value");

                    Console.WriteLine("Files and folders in the specified drive root folder:");

                    foreach (JsonElement item in items.EnumerateArray())
                    {
                        string name = item.GetProperty("name").GetString();
                        Console.WriteLine(name);
                    }
                }
            }
        }
    }
}

Я успешно получил ответ, как показано ниже:

  • Вы также можете передать var url = $"https://graph.microsoft.com/v1.0/users/{userId}/drive/root/children"; Direct, если не хотите передавать DriveID.

Убедитесь, что приложению Microsoft Entra ID предоставлено разрешение API Files.Read.All типа приложения.

Чтобы получить доступ к диску пользователя, вам нужно вызвать graphClient.Users["[email protected]"].Drive.GetAsync(), ваш текущий вызов graphClient.Users["[email protected]"].GetAsync() возвращает базовую информацию о пользователе, но без диска.

При переборе элементов диска вам следует обрабатывать подкачку и, возможно, перебирать все подпапки.

Если вы по-прежнему предпочитаете использовать Graph SDK v5, вы можете использовать этот вспомогательный метод для получения всех файлов с диска пользователя или сайта SharePoint.

public async Task<List<DriveItem>> GetChildItemsAsync(string driveId, string driveItemId, List<DriveItem> allDriveItems)
{
    var allDriveItemChildren = new List<DriveItem>();

    var firstPage = await graphClient.Drives[driveId].Items[driveItemId].Children.GetAsync();
    // if folder has more than 200 items, we need to use PageIterator to retrieve all items
    var pageIterator = PageIterator<DriveItem, DriveItemCollectionResponse>.CreatePageIterator(graphClient, firstPage, driveItem =>
    {
        allDriveItemChildren.Add(driveItem);
        return true;
    });

    await pageIterator.IterateAsync();

    // recursion: retrieve driveItem for each child
    foreach (var item in allDriveItemChildren)
    {
        allDriveItems.Add(item);
        // only folder has child
        if (item.Folder != null && item.Folder.ChildCount > 0)
        {
            await GetChildItemsAsync(driveId, item.Id, allDriveItems);
        }
    }
    return allDriveItems;
}

Вызов вспомогательного метода из основного кода

var items = new List<DriveItem>();
// user's drive
var drive = await graphClient.Users["[email protected]"].Drive.GetAsync();
// site's drive (default document library)
// var drive = await graphClient.Sites["{site_id}"].GetAsync();
var allDriveItems = await GetChildItemsAsync(drive.Id, "root", items);

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

Похожие вопросы

Получение «System.IO.FileNotFoundException: не удалось загрузить файл или сборку Azure.Core, версия = 1.38.0.0» в приложении-функции Azure
Как динамически устанавливать дополнительные свойства в моделях с несколькими запросами в ASP.NET Core Web Api
Поиск самого длинного словаря. Ключевое совпадение во фразе
Каков эффективный способ удаления данных из потока (или TextWriter)?
C# WPF Изменение текстового события из TextBox
Член C#, чтобы проверить свойство на нулевое значение и при необходимости установить его с помощью асинхронной функции?
Список таблиц не обновляется внутри асинхронного таймера
Как извлечь полный идентификатор производителя/поставщика монитора в Windows? (аналогично команде Linux hwinfo --monitor)
Разница между фигурными скобками {} и скобками [] при инициализации массива в С#?
Я не могу извлечь таблицы .sql CREATE TABLE для каждой таблицы в базе данных SQL Azure в репозитории Azure