Я пытаюсь загрузить файл в общую папку сайта SharePoint, используя следующий код:
var uploadSession = await _graphClient.Sites[siteId]
.Drives[driveId]
.Root
.ItemWithPath($"{folderPath}{info.Name}")
.CreateUploadSession()
.Request()
.PostAsync();
Я получил ошибку компиляции:
«DriveItemRequestBuilder» не содержит определения «Root», и не удалось найти доступный метод расширения «Root», принимающий первый аргумент типа «DriveItemRequestBuilder» (вам не хватает директивы using или ссылки на сборку?)
Я также пытался использовать .Items["root"] вместо .Root, та же ошибка.
Дальнейшие мысли:
DriveItemRequestBuilder
класса: один в пространстве имен Microsoft.Graph.Drives.Item.DriveItemRequestBuilder
это для личной папки, например var uploadSession = await _graphClient.Drives[myDrive?.Id]
, и совершенно другой в Microsoft.Graph.Sites.Item.Drives.Item.DriveItemRequestBuilder
это для _graphClient.Sites[siteId].Drive...
это для сайтов, и то, что я нуждаться.Буквально все примеры либо для устаревшей версии, либо для личной папки...
Код для SDK v5 генерируется автоматически, а создание кода C# для некоторых путей, таких как /sites/{siteId}/drives/{driveId}/items/*
, ограничено.
Зная driveId
, вы можете напрямую вызвать /drives/{driveId}
, чтобы получить доступ к корневой папке и элементу по пути.
var uploadSession = await _graphClient
.Drives[driveId]
.Root
.ItemWithPath($"{folderPath}{info.Name}")
.CreateUploadSession
.PostAsync(new Microsoft.Graph.Drives.Item.Items.Item.CreateUploadSession.CreateUploadSessionPostRequestBody { });
@g.pickardou Если вы знаете DriveId, вам не нужен SiteId
большое спасибо за ответ. Я пытаюсь получить идентификатор диска, но безуспешно. Запрос var site = await _graphClient.Sites[$"{siteUrl}:{sitePath}"].GetAsync();
возвращается с сайта успешно, но site.Drives
имеет значение null, и если я попытаюсь напрямую получить диски, то запрос var drives = await _graphClient.Sites[site!.Id].Drives.GetAsync();
также будет успешным, но в ответе будет ноль дисков. Это «сайт группы», и в нем есть папка с подпапками с файлами, которые я могу просматривать и просматривать в интерактивном режиме на сайте...
В вопросе вы используете DriveId, как я и ожидал, вы это знаете. await _graphClient.Sites[site!.Id].Drives.GetAsync() у меня работает нормально. Не могли бы вы проверить, предоставили ли вы разрешения Files.Read.All?
Я могу в интерактивном режиме просматривать, читать и записывать файлы одним и тем же пользователем. Я вхожу в веб-приложение под тем же пользователем
@RaytheonXie-MSFT, за статусом моей проблемы можно следить в этом же разделе комментариев. Вкратце: 1) пользователь имеет полный доступ к сайту группы SharePoint, включая созданные общие папки, 2) пользователь может успешно получить данные сайта с помощью Graph API на C#, однако проблема 3) запрошенные данные сайта не содержат дисков. , а также запрос непосредственно на получение дисков возвращает ноль дисков. Однако, не зная диска, я не могу выполнить исходную задачу: загрузить файл. Я создал специальный вопрос SO для этой дополнительной проблемы: stackoverflow.com/q/78558393/1157814
Мне все еще кажется, что проблема с разрешениями. Не могли бы вы рассказать, какие разрешения были предоставлены?
Большое спасибо, это действительно были разрешения. Что касается ОП, ваш ответ определенно работает, .Sites[siteId]
в этом нет необходимости.
Большое спасибо.... путь содержит siteid, но где находится siteid в компоновщике C# в вашем примере? В этом и заключается разница между двумя классами конструктора: у конструктора сайтов нет ни Root, ни Items[]