1
我试图使用OneDrive API上传文件。身份验证按预期工作。身份验证使用files.readwrite.all
和offline_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错误?
这是正确的。从[文档](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时不应该包含它。 –