Contents

はじめに

設定方法

よくある質問

トラブル対策

Webアプリケーション

リリースノート

ダウンロード

言語

英語

日本語

 

追加情報

Home

Home (alt.)

DICE用webアプリケーション開発

現在DICEのwebサーバは3種類のwebアプリケーション(.NET webアプリケーション、組み込みPerlインタープリタによるPerl CGI実行、PHP 5等のISAPI拡張)をサポートしています。このセクションは、それらの作成/配置方法を解説します。

 

.NET webアプリケーション

1. .NETアプリケーションコンテナ

DICE用の.NET webアプリケーションは、C#/VisualBasic.NET/JScriptで書かれたソースコードまたはコンパイル済みの.NETアセンブリです。ソースコードは初回呼び出し時にDICEによって.NETアセンブリへコンパイルされキャッシュされます。

CGIのような伝統的webアプリケーションと異なり、DICEの.NETコンテナに配置された.NETアプリケーションは、サーバサイドの仮想マシンで持続的にオンメモリ実行され、Javaサーブレット同様に累積的実行結果をwebページとして表示します。

webフォルダ内の"test.cs"は、こうしたアプリケーションの書き方を例示するC#サンプルスクリプトです。

2. .NET webアプリケーションの要件

1. DICE用の.NETアプリケーションは、DICE実行ファイルが存在するディレクトリのManagedAppContainer.dllという名称の.NETアセンブリを参照しなければなりません。

2. DICE用の.NETアプリケーションのエントリポイントは、アセンブリファイルのファイル名(拡張子除く)と同じ名前の名前空間内に存在し、同じクラス名を持つクラスです。もしアプリケーションのソースコードがFoo.csなら、FooというクラスをFooという名前空間内に用意しなければなりません。

3. エントリポイントとなるクラスは、抽象クラスManagedAppContainer.Proxyを実装しなければなりません。この抽象クラスはManagedAppContainer.dllの中に


abstract public class Proxy
{
	abstract public void Execute(
		byte[] strEntityBody,
		Hashtable mapEnvironment,
		ref byte[] strRequestParameterAndOutput
	);
}
	  

として宣言されています。したがって、エントリポイントクラスはこのクラスを継承し、メソッドExecuteをオーバーライドしなければなりません。DICEは.NETアプリケーションがインターネットから呼び出されたときにこのメソッドを呼び出し、呼び出された.NETアプリケーションは実行結果をバイト配列である3番目のパラメータのstrRequestParameterAndOutputを通して返し、それからDICEがそのデータをwebブラウザへ返します。

4. オンデマンドコンパイル機構はDICEサーバ開始時にグローバルアセンブリキャッシュ(GAC)に存在するマイクロソフト製マネージドアセンブリ全てを参照できます(Managed DirectX用の物を除く)。

5. DICE用の.NETアプリケーションはHTTP/1.0 200Content-Lengthを含む全てのHTTPヘッダを出力しなければなりません。

3. .NETアプリケーションのコンテナへのロード

DICEのwebディレクトリに置かれたC#ソースコードは、webからの初回リクエスト時にコンパイルされ、ソースコードと同じディレクトリに.dll拡張子を持つ.NETアセンブリファイルが隠しファイル属性で作成されます。DICEは、隠し属性ファイルへのwebからのリクエストは無視するため、元のURLにはアクセスできるのに対し、コンパイルされたアセンブリはwebユーザからは不可視です。作成された.NETアセンブリはリクエストURL毎に分離されたAppDomainにロードされます。

DICEは、どのような種類のファイルが実行可能なスクリプトであるかをMIMEバインディングによって決定します。デフォルトでは、拡張子が".cs"のファイルはC#に関連付けられ、".vb"はVisualBasic.NETに、".jsx"はJScriptに関連付けられます。また、DICEにソースコードをコンパイルさせる代わりに、コンパイル済み.NETアセンブリ(".dll"ファイル)も設置できます。

一旦ロードされると、前記のエントリポイントクラスのインスタンスが作成され、そのオブジェクトについてオーバーライドされたメソッドExecuteがHTTPリクエストの属性を含むパラメータで呼び出されます。実行エラーが起きた場合、呼び出したwebユーザにエラーメッセージが示されます。.NET webアプリケーションは明示的に削除されない限りDICEがホストするCLRに留まりますので、セッションのようなステートフルオブジェクトを容易に実装することができます。

4. .NETアプリケーションの削除

ソースコードからDICEによってコンパイルされた.NETアプリケーションを削除するには、ソースコードをエクスプローラでファイルシステムから削除し、webからそのURLにwebブラウザでアクセスして下さい。コンパイル済みアセンブリの場合は、エクスプローラからアセンブリのファイル名をリネームした後にそのURLにアクセスし、次いでdllファイルをエクスプローラで削除して下さい。

5. webからの入力の処理

.NETアプリケーションがインターネットから呼び出された時には、Executeメソッドが呼び出されます。

一番目のパラメータstrEntityBodyは、POSTリクエストの場合にエンティティボディのデータを含みます。GETリクエストの場合サイズは0です。

二番目のパラメータmapEnvironmentは、環境データを渡します。現在、REMOTE_ADDRというキーで、呼び出したユーザのIPアドレスを表す値のみを含みます。

三番目のパラメータstrRequestParameterAndOutputは'\n'で区切られたHTTPリクエストヘッダを含みます。このヘッダはユーザ自身で解析しなければなりません。また、このパラメータは生成したページを呼び出しユーザへ返すのにも使用されますので、正しいHTTPリプライヘッダならびに生成されたページを表すバイト列で、このrefパラメータを置き換える必要があります。

サンプルコードtest.csがGETとPOSTリクエストの処理方法を示しています。

(注: .NETアプリケーションのカレントディレクトリはDICEがインストールされたフォルダであるため、ファイルシステムを操作する場合は常に絶対パスを与えなければなりません)

6. セキュリティ

現時点では、DICEがホストする.NETアプリケーションは、DICE自身と同じ権限で実行されます。このことは、システムを不正な動作を行った.NETアプリケーションから保護する障壁が、作成者の安全なコードを書くスキル以外に存在しないことを意味します。この緩みにより、DICEのコンテナ内で(コンテナという語の意味に反して)、如何なるアプリケーションをも動作させることができます。

任意コードの実行に至る可能性のある危険なデータはweb由来の入力から除去されるようにしなければなりません。また、.NETアプリケーションがステートフルである場合、スレッドセーフでなければなりません。DoS(サービス不能)攻撃を防ぐために、可能ならば非同期実行などのテクニックを使い実行結果がDICEにできるだけ早く返されるようにして下さい。

 

Perl CGI webアプリケーション

1. DICEでのPerl CGI実行

DICEのwebサーバ機能は、Perlで書かれたCGI webアプリケーションの実行が可能です。Perl CGIは一旦DICEにロードされるとオンメモリで実行されるため、一般のCGI実行よりも高速です。デフォルト設定では、".pl"拡張子ならびに".cgi"拡張子がPerl CGIとして認識されます。

DICEに組み込まれているPerlのバージョンは5.10開発版です(ソースコードはPerlの公式レポジトリで入手可能)。CGI実行に標準Perlモジュールが必要な場合は、ダウンロードページからDICE用の標準Perlモジュール集をダウンロードし、zip書庫の中身をDICEアプリケーションフォルダ内のperl_libフォルダへ入れてください。

DICEにPerlインタープリタを読み込ませたくない場合は、DICEアプリケーションフォルダ内のPerlShim.dllをリネームするか削除して下さい。

2. DICEでのPerl CGIの要件

Content-Type HTTPヘッダと、HTTPヘッダと実体部の間の改行は、CGI側で出力する必要があります。Unix環境で必要な1行目のシェル呼び出しは必要有りません。

DICEは、行を一行ずつ読む<>演算子でSTDINハンドル名を省略しない限り、標準的なPerl CGIアプリケーションをホスト出来ます。必ず<STDIN>のように明示的に指定してください。

CGIアプリケーションはDICEサーバと同じ権限で実行されるため、セキュリティ上の問題が起こらないよう安全に留意する必要があります。

 

ISAPI拡張

1. 設定

ISAPI (Internet Server Application Programming Interface)拡張は、Microsoft IIS webサーバの機能を拡張するためにユーザが提供するバイナリモジュールです。DICEにISAPI拡張をロードするには、サーバ管理者としてweb UIへログインし、サーバの設定内で特定のファイル拡張子へISAPI拡張dllを割り付けます。DICEは必要なエントリポイント関数を実装した任意のISAPI拡張をロードできますが、全てのISAPI拡張がDICEと互換性を持っているわけではありません。例えば、DICEはASPとASP.NETのISAPIモジュール(asp.dllとaspnet_isapi.dll)をロードできますが、これらは正常に動作しません。現在のバージョンのDICEでは、PHP 5とActivePerlがDICE上で動作確認されています。ただし注意すべき点があり、それら双方をDICEでロードした場合、PHPスクリプトを実行するとDICEがクラッシュします。現状では、単一のISAPI拡張のみをロードするのが安全です。また、ISAPI拡張はDICEサーバと同じ権限で実行されるため、セキュリティ上の問題が起こらないよう安全に留意する必要があります。

2. 利用例 - PHP

まず、Windows用のPHPバイナリをダウンロードして下さい。PHP 4に対するサポートは2007年末で終了していますので、PHP 5を選択して下さい。外部モジュール向けにphp.ini設定ファイルを手動で編集する必要がなくなるため、zipパッケージではなくインストーラパッケージを推奨します。インストーラでは、「IIS ISAPI module」を必ず選択して下さい。インストール後に、C:\Program Files\PHPphp.iniファイルをDICEのアプリケーションディレクトリへコピーして下さい。php.iniはPHPの設定ファイルで、メモ帳などで編集できます(ほとんどの場合そのまま編集せずに使用できます)。それから、DICEに.phpファイルをPHPスクリプトとして解釈させるために、web UI内のサーバ設定で、PHPのISAPI拡張dll(デフォルトのインストールでC:\Program Files\PHP\php5isapi.dll)への割り付けを加えます。

3. 利用例 - Perl

PerlのISAPI拡張は、ActiveStateからActivePerlの一部として入手できます。ActivePerlインストール後に、DICE web UIへ管理者としてログインし、Perlをインストールしたフォルダ内のbinフォルダにあるperlis.dllをcgiやpl等の拡張子と関連付けて下さい。

Perl ISAPI用にスクリプトを書く場合は、HTTPヘッダをスクリプト側で出力する必要はありません。Unix環境で必要な1行目のシェル呼び出しは不要です。エラーログは、Perlのbinフォルダ内に作成されます。