Exchange 2000徹底解剖
開発環境としてのExchange 2000 Server

WebDAVによるファイルのプロパティ操作

 では,WebDAVでどのようにしてファイルのプロパティを操作するのかについて説明する。とはいえ,WebDAVは範囲が広い規格であり,その全機能を紹介することは到底できない。そこで本稿では,Exchange 2000 Serverを利用するのに必要になるであろうプロパティの取得と設定ならびに検索についてのみを扱う。その他の操作方法については,RFC2518やExchange 2000 Platform SDK(http://msdn.microsoft.com/exchange/)に含まれるヘルプファイルを参照してほしい。

●プロパティの取得
 まずは,プロパティの取得から説明する。WebDAVではプロパティの操作にXMLを用いる。

 たとえば,“http://www.foobar.co.jp/public/myData/test.html”というURLで示されるファイルの作成日を取得したいとしよう。その場合,サーバーwww.foobar.co.jpにHTTPで接続し,Table 2に示したPROPFINDメソッドを用いてコマンドを送信することになる。このとき,探したいプロパティの名前をXMLで表現する。詳しいことは後述するが,作成日を示すプロパティはDAVネームスペースのcreationdateというフィールドで示されることになっている。そのため,List 3のようなデータを送信することで,ファイルの作成日を取得できる。

 サーバーからの応答は,XML形式のテキストとして返される。List 3に示したコマンドをサーバーに送信したとき,その応答はList 4のようになる。

 では,List 3List 4を簡単に説明する。

 WebDAVでは,操作したいプロパティ名をXMLネームスペースを使って指定する。List 3の6〜9行目が,取得したいプロパティ名を指定する部分である。

 7行目にある,“<a:propfind xmlns:a="DAV:">”という箇所が,プロパティの取得(つまりPROPFINDメソッドでどのプロパティを操作するのかを指定)するWebDAVにおける命令である。


One Point! 7行目で指定している“a:”というのは,XMLネームスペースのことであり,実際には任意の名前でかまわない。たとえば,7行目を“<dav:propfind xmlns:dav="DAV:">”としても問題ない。そうした場合,8行目以降の“a:”の部分をすべて“dav:”に置き換える必要がある。詳細は,XMLネームスペースに関するドキュメント(たとえばhttp://www.w3.org/TR/REC-xml-names/など)を参照してほしい。

 プロパティを取得したいときには,7〜9行目にあるように,全体をpropfindエレメントで括り,そのあいだにpropエレメントを記述し,そのなかに取得したいプロパティ名をエレメントとして記述する。List 3ではpropエレメントを1つしか指定していないが,必要なだけpropエレメントを列挙し,複数のプロパティを一括して取得することもできる。

<propfind>
  <prop>
    <プロパティ名/>
  </prop>
  <prop>
    <プロパティ名/>
  </prop> 
 …任意の数だけpropエレメントが続く…
</propfind>

 当然ながら,プロパティを参照したいときにはプロパティの名前がどのようなエレメントで表現されるのかを知らなければならない。List 3ではcreationdateエレメントを取得しようとしているわけだが,creationdateエレメントが作成日時を示すプロパティであるということを知っていなければ,このような表現はできないことになる。

 WebDAVの規約では,DAVネームスペースに対してTable 3に示すエレメントを規定している。Table 3に示すエレメントは,WebDAVに対応したすべてのWebサーバーでサポートされる。

 それに対し,Microsoft社が拡張したプロパティを使うこともできる。IIS 5.0やExchange 2000 Serverでサポートされる独自のプロパティを取得するには,拡張されたプロパティを使うことになる。拡張されたプロパティは相当数に上り,ここですべてを紹介することはできない。そのため,ここではネームスペース名と用途のみを示すにとどめる(Table 4)。ネームスペース内で定義されているプロパティについては,Exchange 2000 Platform SDK(http://msdn.microsoft.com/exchange/)のReference項目に掲載されているので,詳細はそちらを参照してほしい。

Table 3 DAVネームスペースで定義されている主なプロパティ

プロパティ解説
creationdate作成日
displayname表示名
getcontentlanguageファイルの言語
getcontentlengthファイルのバイト数
getcontenttypeコンテンツタイプ
getetagETagヘッダ(HTTPの規格書であるRFC2068を参照)の情報
getlastmodified最終更新日
hrefファイルのURL
lockdiscoveryファイルをロックしているユーザーの情報
resourcetypeリソースタイプ
sourceリンクが指定されたときの実態名
supportedlockどのようなロック機構をサポートするかという情報

Table 4 IISやExchange 2000で拡張されているネームスペース

ネームスペース用途
http://schemas.microsoft.com/exchange/Exchange 2000 Serverに固有のプロパティ
http://schemas.microsoft.com/exchange/events/ Exchange 2000 ServerのEvent Sinkに関するプロパティ
http://schemas.microsoft.com/exchange/security/Exchange 2000のセキュリティに関するプロパティ
http://schemas.microsoft.com/mapi/Exchange 2000のMAPI経由のアクセスで使われるプロパティ
urn:schemas:calendar: 予定帳で使われるプロパティ
urn:schemas:contacts: 連絡先で使われるプロパティ
urn:schemas:httpmail: HTTPメールで使われるプロパティ
urn:schemas:mailheader: メールのヘッダ情報を示すのに使われるプロパティ
urn:schemas-microsoft-com:datatypes 日付の表記を示すのに用いられるプロパティ
urn:schemas-microsoft-com:exch-data: Exchange 2000 Serverに特有の型情報を示すのに用いられるプロパティ
urn:schemas.microsoft.com:fulltextqueryinfo フルテキストサーチに使われるプロパティ
urn:schemas-microsoft-com:office:forms HTMLフォームに関するプロパティ
urn:schemas-microsoft-com:office:officeMicrosoft Officeドキュメントのドキュメント情報に関するプロパティ
urn:schemas-microsoft-com:xml-data XMLのデータ形式を定義するプロパティ

 さて,List 3を実行した結果,List 4に示した応答が得られる。List 4を参照してもらうとわかるように,List 3で指定したプロパティがpropstatエレメントで囲まれて表現される。porpstatエレメントの内部にはstatusエレメントがあり,そこにはHTTPのステータスが入る。そして,その後ろにpropエレメントが続き,そのなかにクライアントからの要求部分(List 3)で指定されたプロパティ(エレメント)が続き,値が含まれることになる。

<propstat>
  <status> HTTPのステータス</status>
  <prop>
    <プロパティ名>
      プロパティの値
    </プロパティ名>
  </prop>
</propstat>

One Point! 常にpropstatエレメントのすぐ後ろにstatusエレメントが続き,propエレメントが指定されるとは限らない。IIS 5.0の場合にはこの順番になるが,ほかのWebサーバーでは順序が異なったり,あいだに別のエレメントが挟まったりすることもあり得る。

 List 4は,1つのプロパティを参照したときの単純な結果である。しかし実際には,PROPFINDメソッドの応答形式はもう少し複雑になり得る。たとえば,複数のプロパティの参照を指定したとき,一部のプロパティだけ存在しなかったり,参照権限がなかったりすると,また違った応答が返される(具体的には,要求に指定したプロパティの数だけ複数のpropstatエレメントが返され,その内部に含まれる個々のstatusエレメントにHTTPエラーコードが返される)。また,ディレクトリのプロパティを参照する場合には,Depthヘッダを使って,そのディレクトリに対するプロパティを取得するのか,ディレクトリのなかにある全ファイルに対するプロパティを取得するのかを指定できるようになっている。さらには,propnameエレメントを使って,たとえばList 5のようにすると,特定のURLに設定されている全プロパティの一覧を取得することもできる。

 細部まで説明しているとキリがないため,詳細についてはRFC2518を参照してほしい。

Prev 13/27 Next