У нас есть несколько сайтов 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?
фрагмент кода, который мы предоставили ранее. См. изображение диска SharePoint. Нам нужно получить документы, которые загружены на диск. Вот тестовое изображение, которое мы загрузили и которое нужно получить с помощью Graph API.
Вы пробовали вышеуказанный API?
Да, мы пробовали, но DRIVE получил ноль.
Хорошо, проверю и обновлю
Попробуйте https://graph.microsoft.com/v1.0/users/UserID/drives/DriveID/root/children
graph.microsoft.com/v1.0/Users/UserId/drive/root/children это работает в POSTMAN, но не на уровне кода.
Вы хотите использовать только GraphClient или вы можете разобрать https-запрос в коде и получить результат?
Мы использовали GraphServiceClient.
Проверьте это, если с вами все в порядке, я опубликую ответ с полным кодом
Да, меня это устраивает.
В 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);
Попробуйте
https://graph.microsoft.com/v1.0/Users/UserId/drive/root/children