Загрузка файла сайта SharePoint API Graph: ошибка компиляции DriveItemRequestBuilder не содержит определения для корня

Я пытаюсь загрузить файл в общую папку сайта 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, та же ошибка.

Дальнейшие мысли:

  • Я понял, что это связано с некоторыми критическими изменениями в пакете nuget Microsoft.Graph, по крайней мере, с версией 4.x.x он компилируется. Однако мне придется использовать пакет 5.x.x для других частей кода.
  • Чтобы сделать поиск ответа еще более безнадежным, я понял, что есть два разных DriveItemRequestBuilder класса: один в пространстве имен Microsoft.Graph.Drives.Item.DriveItemRequestBuilder это для личной папки, например var uploadSession = await _graphClient.Drives[myDrive?.Id], и совершенно другой в Microsoft.Graph.Sites.Item.Drives.Item.DriveItemRequestBuilder это для _graphClient.Sites[siteId].Drive... это для сайтов, и то, что я нуждаться.

Буквально все примеры либо для устаревшей версии, либо для личной папки...

Стоит ли изучать 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
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Код для 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 { });

Большое спасибо.... путь содержит siteid, но где находится siteid в компоновщике C# в вашем примере? В этом и заключается разница между двумя классами конструктора: у конструктора сайтов нет ни Root, ни Items[]

g.pickardou 29.05.2024 12:44

@g.pickardou Если вы знаете DriveId, вам не нужен SiteId

user2250152 29.05.2024 15:35

большое спасибо за ответ. Я пытаюсь получить идентификатор диска, но безуспешно. Запрос var site = await _graphClient.Sites[$"{siteUrl}:{sitePath}"].GetAsync(); возвращается с сайта успешно, но site.Drives имеет значение null, и если я попытаюсь напрямую получить диски, то запрос var drives = await _graphClient.Sites[site!.Id].Drives.GetAsync(); также будет успешным, но в ответе будет ноль дисков. Это «сайт группы», и в нем есть папка с подпапками с файлами, которые я могу просматривать и просматривать в интерактивном режиме на сайте...

g.pickardou 29.05.2024 16:55

В вопросе вы используете DriveId, как я и ожидал, вы это знаете. await _graphClient.Sites[site!.Id].Drives.GetAsync() у меня работает нормально. Не могли бы вы проверить, предоставили ли вы разрешения Files.Read.All?

user2250152 30.05.2024 08:50

Я могу в интерактивном режиме просматривать, читать и записывать файлы одним и тем же пользователем. Я вхожу в веб-приложение под тем же пользователем

g.pickardou 30.05.2024 12:33

@RaytheonXie-MSFT, за статусом моей проблемы можно следить в этом же разделе комментариев. Вкратце: 1) пользователь имеет полный доступ к сайту группы SharePoint, включая созданные общие папки, 2) пользователь может успешно получить данные сайта с помощью Graph API на C#, однако проблема 3) запрошенные данные сайта не содержат дисков. , а также запрос непосредственно на получение дисков возвращает ноль дисков. Однако, не зная диска, я не могу выполнить исходную задачу: загрузить файл. Я создал специальный вопрос SO для этой дополнительной проблемы: stackoverflow.com/q/78558393/1157814

g.pickardou 31.05.2024 08:23

Мне все еще кажется, что проблема с разрешениями. Не могли бы вы рассказать, какие разрешения были предоставлены?

user2250152 31.05.2024 09:55

Большое спасибо, это действительно были разрешения. Что касается ОП, ваш ответ определенно работает, .Sites[siteId] в этом нет необходимости.

g.pickardou 31.05.2024 11:12

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