我试图使用OneDrive API上传文件 . 身份验证按预期工作 . 身份验证使用 files.readwrite.all
和 offline_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 回答
尝试从块上传Put请求中删除授权标头(Bearer access token) . Graph API不需要它,也许它会导致问题 .