OneDrive 文件上传意外 401

OneDrive file upload unexpected 401

我正在尝试使用 OneDrive API 上传文件。身份验证按预期工作。身份验证使用 files.readwrite.alloffline_access 范围。获取用户文件等其他调用也按预期工作。尝试上传文件时出现 401 未授权错误。

首先,我创建一个上传会话并使用以下代码获取上传 URL:

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 上传文件。内容包含我要上传的第一个块的字节。 Content-Length 和 Content-Range 也设置正确。我使用相同的客户端将内容发送到上传 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);

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

如何解决 401 错误?

尝试从块上传 Put 请求中删除授权 header(Bearer + 访问令牌)。 Graph API 不需要它,这可能是导致问题的原因。