連載:世界のWebサービス
第3回 リモート・ストレージ・サービス

1.サンプル・プログラムXFSClientの作成

田口 景介
2001/04/11

 XFSが提供するWebサービスはいたってシンプルなものだ。公開されているメソッドは、次の表に示すようにわずかに4つだけで、ディレクトリや細かなアクセス制御はサポートされていない(Windows 9x/Meのワークグループ共有フォルダのように、パスワードの使い分けによる簡単なアクセス制御は可能)。

ファイルの書き込み
void writeFile(String userid, String filedata, String filename, String password)
String userid ユーザーID(登録したメール・アドレス)
String filedata 書き込むファイルの内容(Base64エンコード)
String filename ファイル名
String password パスワード
ファイルの読み出し
String readFile(String userid, String filename, String password)
戻り値 読み出したファイルの内容
String userid ユーザーID(登録したメール・アドレス)
String filename ファイル名
String password パスワード
ファイルの削除
String removeFile(String userid, String filename, String password)
戻り値 正常に終了すれば文字列「Success」が戻る
String userid ユーザーID(登録したメール・アドレス)
String filename ファイル名
String password パスワード
格納されたファイルの一覧を取得
String listFiles(String userid, String password)
戻り値 ファイル一覧(XML形式)
String filename ユーザーID(登録したメール・アドレス)
String password パスワード
XFSが提供するWebサービスで公開されている4つのメソッド

 XFSストレージへデータとして書き込めるのはテキストだけで、さらにこのデータはBase64でエンコードされている必要がある。Base64とは、メールにバイナリ・ファイルを添付するときなどに使われるエンコード形式で、データはすべて英数字のみで表現される。このため、ファイルを保存するときにはBase64への変換を行い、読み出すときにはBase64から元の状態へ戻す処理を行う必要がある。

サンプル・プログラムXFSClient

 今回作成したサンプル・プログラムのXFSClientも、XFSサービスに負けず劣らずシンプルなものだ。

今回作成したXFSClientプログラムの実行画面
XFSClientは、XFSを利用するクライアント・アプリケーションである。XFSストレージに保存されたファイルの読み書きと削除が可能だ。
  登録したメール・アドレスをユーザーIDとして入力する。
  Admin Passwordなどに指定したパスワードを入力する。
  ファイル名を指定する。XFSにディレクトリはないので、パスの概念はない。
  XFSストレージから読み込んだ、あるいはXFSストレージに書き込むファイルの内容。
  クリックすると、テキストボックスの内容をXFSストレージに書き込む。
  クリックすると、XFSストレージ上のファイルを読み込み、テキストボックスに表示する。
  指定したファイルを削除する。

 ここで[保存]ボタンをクリックすると、テキストボックス(editBox)に入力されたテキストを指定したファイル名でXFSストレージに保存し、[開く]ボタンをクリックすると、指定したファイルをテキストボックス(editBox)に読み込む。また、[削除]ボタンをクリックすれば、指定のファイルを削除できる。なお、listFilesメソッドによるファイルの一覧表示機能は実装していないので、必要ならばXFSのasmxファイルをWebブラウザで開き、ここからメソッドを呼び出してほしい。すると、次のリストに示すようなXML形式でファイル一覧情報が1つの文字列として戻る。

<FileList>
    <FileDetail>
        <Name>testfile</Name>
        <Type>File</Type>
        <LastModified ms=969919864000>Mar 25, 2001</LastModified>
        <Bytes>1020</Bytes>
    </FileDetail>
    <FileDetail>
        <Name>testfile2</Name>
        <Type>File</Type>
        <LastModified ms=969960267000>Mar 26, 2001</LastModified>
        <Bytes>6</Bytes>
    </FileDetail>
<Totals NumberOfEntries=2 TotalBytes=1026 FreeBytes=9998974/>
</FileList>
listFilesメソッドの実行結果

 機能的には非常にシンプルなXFSClientだが、その実装は単純にwriteFileメソッドやreadFileメソッドを呼び出すだけではない。前述したように、読み書きするファイルの内容はBase64でエンコードされていなければならないので、XFSストレージにファイルを保存するときには、テキストボックスに入力されたテキストをBase64でエンコードしなければならず、逆に読み出すときにはデコードしなければならないからだ。実はXFSClientの主要なコードは、ほとんどがこのBase64処理で占められていて、XFSサービスを呼び出すコードはほんの数行にすぎない。

 それでは、コードの解説をしよう。Base64エンコードを行う保存処理と、Base64デコードを行う読み出し処理は非常によく似ているので、保存処理だけを解説することにする。

protected void bSave_Click (object sender, System.EventArgs e)
{
  // テキストボックスに入力されたテキスト
  String s = tEditBox.Text;

  // 次に定義するpstmoutストリームの実体
  MemoryStream mout = new MemoryStream();
  // Base64エンコードの結果を受け取るメモリストリーム
  CryptoMemoryStream pstmout = new CryptoMemoryStream(mout);
  // Base64エンコードを行うオブジェクト
  EncodeAsBase64 enc = new EncodeAsBase64();
  // エンコード結果を格納するストリームを設定
  enc.SetSink(pstmout);

  // String型からbyte[]への変換
  UnicodeEncoding ue = new UnicodeEncoding();
  // Base64エンコードの実行
  enc.Write(ue.GetBytes(s));

  statusBar.Text = "保存中";
  try
  {
  // エンコード結果を再びString型に戻す
    ASCIIEncoding ae = new ASCIIEncoding();
    String encstr = ae.GetString(mout.GetBuffer(), 0, (int)mout.Length);

    // Webサービスの呼び出し
    XFS xfs = new XFS();
    xfs.WriteFile(tUserID.Text, encstr, tFilename.Text, tPassword.Text);
    statusBar.Text = "正常に保存されました";
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.ToString());
    statusBar.Text = "エラーが発生しました";
  }
}
XFSストレージへの保存処理部分のリスト

 保存処理は以下の手順で行う。

  1. テキストボックスの文字列をbyteの配列に変換する。
  2. byteの配列をBase64形式にエンコードし、再度文字列に変換する。
  3. XFS.writeFileメソッドを呼び出し、XFSストレージに保存する。

■Base64エンコード(EncodeAsBase64クラス)
 一連の処理のなかで最も手間がかかりそうに見えるのは、Base64形式へのエンコードだが、この処理は.NET Frameworkで定義されるSystem.Security.Cryptography.EncodeAsBase64クラスを使って実現できるため、プログラマはBase64の詳細について知る必要はない。

 Base64処理がCryptography(暗号法)ネームスペースに含まれているのは不思議に思われるかもしれないが、.NET Frameworkでは、Base64エンコードは暗号化の一環として捉えられているようだ。なおこのネームスペースでは、Base64以外にも、DESやRC2、それにRSAといった暗号化アルゴリズムが定義されている。

■文字列→byte配列への変換(UnicodeEncoding、ASCIIEncodingクラス)
 
このEncodeAsBase64クラスを利用してBase64エンコードを行うには、入力文字列をbyte配列へと変換しなければならない。ところが.NETでは、文字とbyte型データは厳密に区別されているため、String型変数に格納されている文字列を単純にbyte型の配列に変換することはできない(char型の配列には変換可能)。そこで利用するのが、System.Text.UnicodeEncodingクラス(Unicodeとの変換)や、System.Text.ASCIIEncodingクラス(ASCIIとの変換)である。これらのクラスは、指定したエンコーディング方式(文字コード)で、String型データをbyte型配列へと変換することができる。

 XFSClientでは、まずUnicodeEncodingクラスを用いて、byte型配列への変換を行っている。このとき、String型データは、もともとUnicodeで文字が表現されているため、エンコーディングは影響を受けず、単純にbyte型へと変換される。そしてBase64へのエンコードを行った後、再度byte型配列をString型へと変換する。Base64エンコードされたデータはASCIIコードで表されているため、今度はASCIIEncodingクラスを用いてString型データへの変換を行う。

 なお、System.Textネームスペースで定義されているCodePageEncodingクラスを利用すれば、指定したコード・ページに対応するエンコーディングへの変換も可能だ。たとえば、コード・ページ932を指定すれば、Shift JISへ変換することができる。

■XFSサービスの呼び出し
 
そして最後にXFSサービスのWriteFileメソッドを呼び出し、リモート・ストレージへの書き込みを行う。このとき、ユーザーIDやパスワードが間違っていたり、1Mbytesの上限を超えていたりすると例外が発生するので、try〜catch構文で例外処理を行う。

XFSClientのコンパイル

 XFSClientの全ソースコードは膨大なので、記事中には掲載しない。これについては、以下のリンクからファイルをダウンロードしていただきたい。

XFSClient.csのダウンロード
コンパイル用のバッチ・ファイルmake.batのダウンロード

 XFSClientをコンパイルするには、XFSClient.csを格納したディレクトリで、コマンドプロンプトから以下の2つのコマンドを順に実行する(これらをバッチ・ファイルにしたものが上記のmake.batである)。正常にコンパイルされれば、カレント・ディレクトリにXFSClient.exeが生成される。

WebServiceUtil /c:proxy /out:XFS.cs /n:XFSClient
/pa:http://services3.xmethods.net/dotnet/xmethods/xfs/xfs.asmx?SDL

csc /t:winexe /out:XFSClient.exe /r:System.WinForms.dll
/r:Microsoft.Win32.Interop.dll /r:System.XML.Serialization.dll
/r:System.Web.Services.dll /r:System.dll /r:System.Data.dll
/r:System.Drawing.dll XFS.cs XFSClient.cs

XFSClientプログラムのコンパイル

 なお、このサンプル・プログラムでは、リモート・ストレージへ書き込んだ文字列の合計バイト数が奇数の場合、それを読み込んで表示したときに最後の1文字が消えてしまう。これはおそらく、クラス・ライブラリにおけるBase64デコード処理のバグが原因と思われる。プログラムで回避することもできるが、サンプルということで、このプログラムではそのままにしてある。

モバイル・デバイスのWebサービス

 現在リモート・ストレージ・サービスは、Webブラウザからアクセスするものが主流だが、これではわずかに縦横100〜200ドット程度の画面しか持たないPDAや携帯電話でブラウザを通してアクセスするのは不可能に近い。しかし、Webサービスとして実装されていれば、クライアント側に適切なユーザー・インターフェイスを実装することが可能になる。これはリモート・ストレージ・サービスに限らず、WWW上の数多くのサービスに当てはまることだ。

 ただ、Webサービスを利用するためには、クライアント側にアプリケーションの実行環境が必要になる。そこでマイクロソフトは携帯電話向けにStinger(Windows CE 3.0ベースの携帯電話用OS)を開発しているわけだが、少なくとも国内では分の悪い戦いを強いられる可能性がある。すでにこの市場ではJava陣営が橋頭堡を築きつつあるからだ。

 2〜3月に発売されたDoCoMoの携帯電話503iシリーズでは、「iアプリ」の名前でJavaアプリケーションが利用可能になっている。2001年3月の時点で、契約者数が2000万人を超えたと言われるiモード・ユーザーが、いずれiアプリ対応機種へと乗り換えてくるとすれば、膨大なユーザーがそれと知らずにJavaアプリケーションを利用するようになる。また、今年の夏にはJ-PhoneやauもJava実行環境を備える携帯電話を発売予定とされているし、PalmやZaurusにもJava実行環境が実装されている。携帯電話やPDAの世界では、ほとんどJava一色といってもいいだろう。

 今のところモバイル・デバイス向けJava環境には、Webサービスに相当する機能は実装されていないが、いずれ携帯電話やPDAにSun ONE(Sun Open Net Environment)が搭載され、Webサービス相当の機能が組み込まれることは間違いない。このままいくと、PCクライアントに関して言えば、マイクロソフトがWindows XPを武器に.NETを広めていくだろうが、モバイル・クライアントではJava陣営が一歩先んずることになりそうだ。End of Article

関連リンク
Yahoo Briefcase
Xdrive
Office eServicesのページ
XMethodsのユーザー登録ページ
XFS Webサービスのテスト・ページ(asmxファイル) 
 
 

 INDEX
  [連載]世界のWebサービス―― 究極のWebサービスを求めて ――
  第3回 リモート・ストレージ・サービス
  1.サンプル・プログラムXFSClientの作成
 
「世界のWebサービス」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間