2016-04-03 70 views
1

我知道這已經被問了很多次了,但是我還沒有找到解決我的問題的工作解決方案。如何使用訪問令牌從Sharepoint在線下載文件

問題:

我需要從使用C#應用程序使用CSOM和JWT令牌SharePoint Online網站下載文件。當我來到我稱之爲此方法的地方時

File.OpenBinaryDirect(ClientContext context, string serverRelativeUrl); 

我收到401未授權錯誤。

我使用證書在Azure AD中驗證我的應用程序。它適用於訪問SharePoint列表,列表項等,這意味着下載文件是我收到此錯誤消息的唯一部分。

我所做的

我做了一些研究此事,發現在MSDN上一個線程從2年前(https://social.msdn.microsoft.com/Forums/office/en-US/7746d857-d351-49cc-b2f0-496663239e02/how-to-download-a-file-version-from-office-365-using-csom?forum=sharepointdevelopment)提的是,這是不可能的使用訪問令牌從SP下載文件。

這是一個古老的線程,所以自那時起,一些東西一定會發生變化,但到目前爲止,我還沒有找到一個可行的解決方案。

我在互聯網上遇到的所有文章都提到了向上下文提供用戶憑據。但我的客戶堅持使用證書。正因爲如此,我不能使用這種方法

問題

有沒有一種方法,我可以下載使用JWT令牌從SharePoint Online中的文件嗎?

回答

1

在尋找解決方案時,我偶然發現了描述Sharepoint Online REST API的MSDN文章,並且有一個File端點,我決定嘗試一下。 這裏是我想出來的:

public byte[] GetFileContent(File file) 
{ 
    var request = System.Net.HttpWebRequest 
     .Create($"{_serviceDefinition.ServiceId}/_api/Web/getfilebyserverrelativeurl('{file.ServerRelativeUrl}')/$value"); 

    request.Headers.Add(System.Net.HttpRequestHeader.Authorization, $"Bearer {GetAccessToken()}"); 

    byte[] fileData = new byte[0]; 

    using (var sr = request.GetResponse().GetResponseStream()) 
    { 
     using (var ms = new System.IO.MemoryStream()) 
     { 
      byte[] buffer = new byte[0x1000]; 
      int bytes; 
      while ((bytes = sr.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, bytes); 
      } 

      fileData = ms.ToArray(); 
     } 
    } 

    return fileData; 
} 

長話短說我創建的HttpWebRequest到以下網址:https:// {} address.of.your.sharepoint.site/_api /網絡/ getfilebyserverrelativeurl('{file.ServerRelativeUrl}')/ $ value,將我的不記名標記添加到請求中,然後將響應讀取到字節數組中以供進一步處理。

工程就像一個魅力,但打破了CSOM的概念。

相關問題