1

我试图使用OneDrive API上传文件。身份验证按预期工作。身份验证使用files.readwrite.alloffline_access范围。其他诸如获取用户文件的调用也按预期工作。当要上传文件时,我收到401未经授权的错误。OneDrive文件上传意外401

首先我创建的上载会话和使用下面的代码获取上传网址:

using (HttpClient client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("https://graph.microsoft.com"); 
    client.DefaultRequestHeaders.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.ToString()); 

    HttpResponseMessage response; 

    response = await client.PostAsync("/v1.0/drive/root:" + path + "/" + file.FileName + ":/createUploadSession", null); 


    string uploadUrl = (string)JObject.Parse(await response.Content.ReadAsStringAsync())["uploadUrl"]; 
} 

可正常工作。响应状态码是200,我得到上传URL。接下来,我想使用上传网址上传文件。内容包含我想要上传的第一个块的字节。内容长度和内容范围也设置正确。我使用放置请求将使用相同客户端的内容发送到上传URL。

ByteArrayContent content = new ByteArrayContent(chunk); 
content.Headers.Add("Content-Length", (contentRangeEnd - contentRangeBegin).ToString()); 
content.Headers.Add("Content-Range", "bytes " + contentRangeBegin + "-" + (contentRangeEnd - 1) + "/" + allBytes.Length); 

response = await client.PutAsync(uploadUrl, content); 

放置请求导致401错误。访问令牌似乎是有效的,因为其他调用如获取文件按预期工作。

如何解决401错误?

回答

2

尝试从块上传Put请求中删除授权头(承载+访问令牌)。它不是图形API所必需的,也可能是导致问题的原因。

+0

这是正确的。从[文档](https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/api/item_createuploadsession#upload-bytes-to-the-upload-session):包括发出PUT调用时的授权标头可能会导致HTTP 401 Unauthoized响应。只有在第一步中发布POST时才应该发送Authoization标头和不记名标记。发布PUT时不应该包含它。 –