首页 文章

OneDrive文件上传意外401

提问于
浏览
1

我试图使用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 . 接下来我想使用上传网址上传文件 . 内容包含我要上传的第一个块的字节 . Content-Length和Content-Range也正确设置 . 我正在使用put请求将使用相同客户端的内容发送到上传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错误?

1 回答

  • 2

    尝试从块上传Put请求中删除授权标头(Bearer access token) . Graph API不需要它,也许它会导致问题 .

相关问题