Windows用OneDriveAPI導入まで

2015年2月下旬にリリースされたOneDrive API(C#)の導入方法です。

ni_odapi1_1

事前に準備するもの

VisualStudioとMicrosoftアカウント

OneDriveとは何か

15GBの容量と、Office Onlineが無料で使える環境です。
詳しくはこちら

APIやサンプルで何が出来るか

OneDrive内の大抵の動作を制御することが出来ます。
・MSアカウントのサインイン、サインアウト
・リフレッシュトークンを使用したサインイン継続
・OneDrive内のファイル情報取得
・OneDriveへファイルのアップロード(大きいファイル用にプログレスバー対応も有り)
・OneDrive内にあるファイルのダウンロード
・OneDrive内にあるファイルの削除
・指定したURLからOneDriveへファイルのコピー
・OneDrive内にあるファイル検索
などなど
※OneDrive for Businessは非対応です

開発の準備をしよう

サンプル(SDK入り)をダウンロードします
ダウンロードするにはSamplesタブを選択して
OneDrive API Explorer (Windows/C#) を選ぶとGitHubに遷移しますので、
右下にあるDownload ZIPを押してサンプルをダウンロードします。

ni_odapi1_2

 

Zipファイルのダウンロードが終わったら展開して
OneDriveApiExokirer.slnを起動します。

ni_odapi1_3

 

VisualStudioが起動したら、ビルドして動作を確認しましょう。
※OneDriveにはMicrosoftアカウントでサインインします。

ni_odapi1_4

 

一通り確認したところで、次に開発になります

VisualStudioでC#用プロジェクトを作成し、
サンプルに入っているプロジェクトの参照設定情報を見てライブラリをインストールをします。
※OneDriveSDKは、サンプルをビルドした際に出来たdllを使用します。
次にサンプルからサインイン、サインアウト用のコードを自分のプロジェクトに追加します。
・Auth/OAuthAuthenticator.cs
・Auth/OAuthTicket.cs
ここで注意!
コピーしただけでは、「OneDriveApiExplorer」として動いてしまうので、
作成するアプリ用にクライアントIDとクライアントシークレットを取得しましょう。

取得方法は、
Microsoft アカウント デベロッパー センター
にアクセスして、アプリケーション名と言語を選択して「同意」します。
次にマイアプリ→(作成するアプリ)→設定の編集→API設定に進み
いいえ」になっている選択欄を「はい」にして保存ボタンを押下します。
これでMSアカウントを使ったアプリの登録は完了になります。
登録すると、クライアントIDとクライアントシークレットが発行されますので
Auth/OAuthAuthenticator.csの
msa_client_idにクライアントID
msa_client_secretにクライアントシークレット
をそれぞれ書き換えます。
新規に作成したプロジェクトではRefreshToken周りの設定がされていないと思いますので
Settings.settingsの設定を下記のようにします。

ni_odapi1_5

 

これで自分のアプリとして開発する準備が整いました。
あとはサンプルから使いたい処理を参考にして開発する形になります。

SharePoint2013  開発メモ

前回はSharePoint2013アプリの登録に関して記載いたしましたが
今回は開発にあたり、はまりそうな所を記載していきます。

ファイルの情報を取得するまでの流れ

SharePoint2013は

  1. サイト(サブサイト含む)
  2. リスト(ドキュメント・マイクロフィードなど)
  3. リストアイテム(フォルダ・ファイルなど)

のような感じで情報が管理されており、ファイル等のリストアイテムを取得したい場合は
1から順番に情報を取得する必要があります。

それぞれ対応するクラスは下記になります。

サイト WebCollectionクラス
リスト ListCollectionクラス
リストアイテム ListItemCollectionクラス

eoe20150310
Exceed One Explorer
※SharePointのアイコンの階層がサイト、「サイトのページ」などの階層がリスト、その他はリストアイテムから取得できます。

 

リストアイテムを見ないとファイルの場所がわからない?

リストには階層情報を保持していないため、ファイルの場所が分かりません。
リストからファイルがある場所を知りたい場合は以下のようなルールになっている模様なので、参考にしていただければと思います。

foreach(List list in (ListCollection)){
  if(!String.IsNullOrEmpty(list.DocumentTemplateUrl)){
/*
    list.DocumentTemplateUrlを「/」で分解してForms階層の上の階層にファイルがある
*/
  }
  if(list.EntityTypeName.IndexOf("List")!=-1){
/*
    エンティティ名の後ろにListが含まれているときは
    Lists/(Listを除去したエンティティ名)/
    にファイルがある。
    list.EntityTypeNameは、スペースなどの文字を「_x0020_」で保持しているため、必要に応じて変換する。*/
  }
}

SharePoint上にあるOfficeファイルをOfficeOnlineで編集させたい

Office2013がインストールされているWindowsPCであれば、Office2013用ファイルがあるURLにアクセスした際Office2013がSharePoint2013と通信して作業することが可能ですが、
Web上で編集したい場合OfficeOnlineで読み込めるものであれば、OfficeファイルURLの後ろに ?d=w(ハイフンを抜いたファイルの固有ID)にアクセスすると、OfficeOnlineが起動しWeb上で操作ができます。

 

アプリを起動して放置していたらJSON通信を行うアプリでエラーが出る

SharePointContextFilterを使用している場合はデフォルトでセッションが20分で切れ、コンテキストトークン値がセッションから破棄されます。
セッションが切れた場合、アクセストークン及びリフレッシュトークンが有効期間内でもエラーになりますので、
あらかじめ下記のようにセッションの有効期限を設定します。
Web.configのsystem.web項目に
<sessionState timeout=”(有効期限/分)”/>
を追加すると解決します。

※C#でセッション有効時間を確認したい場合、HttpContextBase.Session.Timeoutで確認できます。
※Azure websitesでは、sessionStateがInProcモードの場合、指定した時間前でもセッションが破棄されるケースがありますので注意してください。