Я разработал веб-приложение с использованием Ms Graph API для копирования файлов из библиотек sharepoint в другие библиотеки sharepoint (все онлайн).
Я вызываю копию Graph API следующим образом:
POST https://graph.microsoft.com/v1.0/drives/SrcDriveID/items/*SrcDriveItem*/copy?@microsoft.graph.conflictBehavior=replace
{ "parentReference" : { "driveId": "*DestDriveID*", "id": "*DestParentDriveItem*" }, "@microsoft.graph.conflictBehavior":"replace" } }
Я получаю следующую ошибку:
<Internal Server Error> <{"error": {"code": "generalException","message": "An unspecified error has occurred.","innerError": {"request-id": "0623069a-7071-47f9-be92-48d58902f300","date": "2020-05-06T21:11:07"}}}>
Веб-приложение использует делегированные разрешения и только рабочие учетные записи. Гранты, предоставленные этому приложению для Graph API:
- Directory.read.all
- File.ReadWrite
- Sites.Read.All
- User.Read
- File.ReadWrite.All
Проблема систематическая c в моей производственной среде. У меня его нет в моей среде разработки, хотя разрешения такие же. Пользователи, запускающие веб-приложение (и связанный с ним ключ-носитель), имеют доступ на чтение и запись к исходной и целевой библиотекам точек общего доступа. В пункте назначения они являются членами, а не владельцами.
Любая помощь приветствуется!
Заранее спасибо
ОБНОВЛЕНИЕ : Добавление. NET C# Код:
StringBuilder jsonData = new StringBuilder("{ \"parentReference\" : { \"driveId\": \"" + DestDriveID + "\", \"id\": \"" + DestParentDriveItem + "\" }, \"@microsoft.graph.conflictBehavior\":\"replace\" } }");
String restCallUrl;
if (overwrite)
{
restCallUrl = _baseUri + "drives/" + SrcDriveID + "/items/" + SrcDriveItem + "/copy?@microsoft.graph.conflictBehavior=replace";
}
else
{
restCallUrl = _baseUri + "drives/" + SrcDriveID + "/items/" + SrcDriveItem + "/copy";
}
HttpClient apiCallClient = new HttpClient();
HttpRequestMessage apiRequest = new HttpRequestMessage(HttpMethod.Post, restCallUrl);
apiRequest.Headers.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpContent addAttachmentBody = new StringContent(jsonData.ToString(), Encoding.UTF8, "application/json");
apiRequest.Content = addAttachmentBody;
apiRequest.Headers.Add("Authorization", "Bearer " + _accessToken);
HttpResponseMessage apiCallResponse = await apiCallClient.SendAsync(apiRequest);
if (apiCallResponse.StatusCode != System.Net.HttpStatusCode.Accepted)
{
String requestResponse = await apiCallResponse.Content.ReadAsStringAsync();
_mylog.Warning("Copy -<" + apiCallResponse.ReasonPhrase + "> <" + requestResponse + ">");
throw new DllNotFoundException();
}
ОБНОВЛЕНИЕ Я понял, что jsonData плохо сбалансирован. Я исправляю следующее:
StringBuilder jsonData = new StringBuilder("{ \"parentReference\" : { \"driveId\": \"" + DestDriveID + "\", \"id\": \"" + DestParentDriveItem + "\" }, \"@microsoft.graph.conflictBehavior\":\"replace\", \"name \": \"" + DstFileName + "\" }");
или
StringBuilder jsonData = new StringBuilder("{ \"parentReference\" : { \"driveId\": \"" + DestDriveID + "\", \"id\": \"" + DestParentDriveItem + "\" }, \"@microsoft.graph.conflictBehavior\":\"replace\" }");
оба не работают с одной и той же ошибкой.
Последний дал мне:
Copy -<Internal Server Error> <{"error": {"code": "generalException","message": "An unspecified error has occurred.","innerError": {"request-id": "ebf30e17-b4be-4994-bf86-bc3b86834d12","date": "2020-05-09T07:30:42"}}}>
ОБНОВЛЕНИЕ : я проделал точно такое же действие в проводнике Graph, и оно сработало
https://graph.microsoft.com/v1.0/drives/b!fffffffffqv/items/01GEGKyyyyyyuuHR/copy?@microsoft.graph.conflictBehavior=replace
{ "driveId": "b!yyyyy", "id": "uuuuuu" }, "@microsoft.graph.conflictBehavior":"replace" }
Оно работает с проводником Graph API, как только File.ReadWrite и файлы .ReadWrite. Все установлены. Я дважды проверю, применяются ли они в моем веб-приложении. ОБНОВЛЕНИЕ Разрешение Files.ReadWrite.All установлено для приложения, в то время как ожидается делегирование. В ожидании изменений. ОБНОВЛЕНИЕ Проблема устранена указанным выше изменением