1

我試圖使用OneDrive API上傳文件。身份驗證按預期工作。身份驗證使用files.readwrite.alloffline_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錯誤?

回答

2

嘗試從塊上傳Put請求中刪除授權頭(承載+訪問令牌)。它不是圖形API所必需的,也可能是導致問題的原因。

+0

這是正確的。從[文檔](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時不應該包含它。 –