2016-04-03 104 views
1

これはすでに数回質問されていますが、まだ問題の解決策を見つけることができませんでした。アクセストークンを使用してSharepoint Onlineからファイルをダウンロードする方法

問題:

私はCSOMとJWTトークンを使用してC#のアプリを使用してSharePoint Onlineのサイトからファイルをダウンロードする必要があります。私がこのメソッドと呼んでいるところに来るとき

File.OpenBinaryDirect(ClientContext context, string serverRelativeUrl); 

私は401 Unauthorizedエラーが発生します。

私は証明書を使用してAzure ADで自分のアプリケーションを認証します。 SharePointリスト、リストアイテムなどにアクセスすると正常に動作します。つまり、ファイルをダウンロードするだけでこのエラーメッセージが表示されます。私は

をやった

私はアクセストークンを使用してSPからファイルをダウンロードすることができなかったことを言及する(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)問題に関するいくつかの研究を行い、2年前から、MSDNにあるスレッドを見つけました。

これは古いスレッドなので、何かが変更されている必要がありますが、これまでのところ私は解決策を見つけることができませんでした。

インターネットで私が出会ったすべての記事は、ユーザーの資格情報を文脈に提供すると言及しています。しかし、私のクライアントは証明書の使用を主張しています。そのことを私はこのアプローチを使用することはできませんので

質問

は、私はJWTのトークンを使用してSharePoint Onlineのからファイルをダウンロードすることができます方法はありますか?

答えて

1

解決策を探しているうちに、Sharepoint Online REST APIについて記述したMSDNの記事がありました。ファイルエンドポイントがあり、試してみることにしました。ここ は、私が作ってみたものです:私は、次のURLには、HttpWebRequestを作成

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; 
} 

長い話を短くします。https:// {address.of.your.sharepoint.site}/_API /ウェブ/ getfilebyserverrelativeurl( '{file.ServerRelativeUrl}')/ $ value、私のベアラトークンをリクエストに追加し、応答をバイト配列に読み込んで処理します。

チャームのように機能しますが、CSOMの概念を少し破ります。

関連する問題