OneDrive / onedrive-sdk-csharp

OneDrive SDK for C#! https://dev.onedrive.com
Other
294 stars 143 forks source link

Copy() operation always throws Microsoft.Graph.ServiceException #183

Closed Kyrodan closed 7 years ago

Kyrodan commented 7 years ago

Used libraries:

I tried to copy a file with this code:

var result = await api
    .Drive
    .Root
    .ItemWithPath(sourcepath)
    .Copy(destFilename, new ItemReference {Id = destItem.Id})
    .Request()
    .PostAsync();

All I get is a Microsoft.Graph.ServiceException:

{"Eine Ausnahme vom Typ \"Microsoft.Graph.ServiceException\" wurde ausgelöst."}
    Data: {System.Collections.ListDictionaryInternal}
    Error: {Code: invalidRequest
Throw site: 621a.862f
Message: Cannot call Copy without the respond-async preference
}
    HResult: -2146233088
    HelpLink: null
    InnerException: null
    Message: "Eine Ausnahme vom Typ \"Microsoft.Graph.ServiceException\" wurde ausgelöst."
    Source: "Microsoft.Graph.Core"
    StackTrace: "   bei Microsoft.Graph.HttpProvider.<SendAsync>d__19.MoveNext()\r\n--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bei Microsoft.Graph.BaseRequest.<SendRequestAsync>d__34.MoveNext()\r\n--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bei Microsoft.OneDrive.Sdk.ItemCopyRequest.<PostAsync>d__6.MoveNext()\r\n--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bei System.Runtime.CompilerServic
es.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bei System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bei KeeAnywhere.StorageProviders.OneDrive.OneDriveStorageProvider.<Copy>d__4.MoveNext() in D:\\Entwicklung\\KeeAnywhere\\KeeAnywhere\\StorageProviders\\OneDrive\\OneDriveStorageProvider.cs:Zeile 70."
    TargetSite: {Void MoveNext()}

What can I do to copy an existing item with a new name to another folder?

cdmayer commented 7 years ago

Thanks for posting. This is a bug. By default the CopyRequest should have the correct header applied. However, here's a workaround you can use:

var result = await api
    .Drive
    .Root
    .ItemWithPath(sourcepath)
    .Copy(destFilename, new ItemReference {Id = destItem.Id})
    .Request(new[] {new Option("Prefer", "respond-async") })
    .PostAsync();

That should apply the missing header. Please try that out and report back.

Kyrodan commented 7 years ago

After changing new Option(...) to new HeaderOption(...) it worked, the file gets copied.

But using the resulting AsyncMonitor always throws an exception. Code:

var item = await result.PollForOperationCompletionAsync(null, CancellationToken.None);

Error:

{"Eine Ausnahme vom Typ \"Microsoft.Graph.ServiceException\" wurde ausgelöst."}
    Data: {System.Collections.ListDictionaryInternal}
    Error: {Code: itemNotFound
Throw site: 6930.fe44
Message: Item does not exist
}
    HResult: -2146233088
    HelpLink: null
    InnerException: null
    Message: "Eine Ausnahme vom Typ \"Microsoft.Graph.ServiceException\" wurde ausgelöst."
    Source: "Microsoft.Graph.Core"
    StackTrace: "   bei Microsoft.Graph.HttpProvider.<SendAsync>d__19.MoveNext()\r\n--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bei Microsoft.Graph.AsyncMonitor`1.<PollForOperationCompletionAsync>d__4.MoveNext()\r\n--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   bei System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   bei KeeAnywhere.StorageProviders.OneDrive.OneDriveStorageProvider.<Copy>d__4.MoveNext() in D:\\Entwicklung\\KeeAnywhere\\KeeAnywhere\\StorageProviders\\OneDrive\\OneDriveStorageProvider.cs:Zeile 83."
    TargetSite: {Void MoveNext()}

The copied file has been succesfully created, only the AsyncMonitor fails.

Kyrodan commented 7 years ago

Now I am using Graph-API which does not have this issue.