OneDrive 文件上传意外 401
OneDrive file upload unexpected 401
我正在尝试使用 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。接下来我想使用上传 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 不需要它,这可能是导致问题的原因。
我正在尝试使用 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。接下来我想使用上传 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 不需要它,这可能是导致问题的原因。