Ms Graph API Onedrive копия, возвращающая generalException - PullRequest
1 голос
/ 08 мая 2020

Я разработал веб-приложение с использованием 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 установлено для приложения, в то время как ожидается делегирование. В ожидании изменений. ОБНОВЛЕНИЕ Проблема устранена указанным выше изменением

1 Ответ

0 голосов
/ 10 мая 2020

Разрешение File.readwrite.all было установлено как приложение, в то время как ожидалось делегирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...