IIS(ASP / ASP.netに限らず) を使ってローカルで Webアプリケーションを開発していると、
環境を作ったり消したりしているうちに、なんらかのタイミングで Webアプリケーションの開発やインストールに
支障が出始めることがある。
結論から言うと、この原因の多くは、『IISが想定しているWebのフォルダ構成』と、
実際に『コンピュータ上に存在する、現実のWebのフォルダ構成』がずれてしまうことによって起きている場合が多い。
では、『IISが想定しているWebのフォルダ構成』はどうやったら確認できるのであろうか?
実は 『IISが想定しているWebのフォルダ構成』を見るツールは、知らぬ間にマシンにインストールされている。
以下のフォルダを見てみよう。
@:\inetpub\AdminScripts\
中身を見ても説明不足なスクリプトがいろいろとあるのだが、
そのうち、disptree.vbs というスクリプトがそれにあたる。
コマンドプロンプトから指定して実行する。
そのまま使用しても良いが、IISが想定している Webのフォルダ構成を確認するだけなら、
以下のように制限すると良いだろう。
disptree.vbs -a IIS://LocalHost/w3svc/1/Root
(“1”は『規定の Webサイト』を指す。OSが Professional系であれば“1”しか指定できないが、
Server系は 2,3... も指定できるはず。これも wmi の一環)
上記を実行することで IISが想定するWebのフォルダ構成がインデント付きのツリー構造として表示される。
一方、今までわれわれが良く使用していた IIS管理ツールで見ることができていたのは
『コンピュータ上に存在する、現実のWebのフォルダ構成』というわけだ。
見比べてみると良い。
(中には“ファイル”が(IIsWebDirectory)として認識されている場合があったりもするが、
心当たりのないもの、またシステムで使用しているっぽいものには今回触れないで置く)
さて、比較の結果、現実のフォルダとしては存在しないのに、disptree.vbs スクリプトで表示される
フォルダがあったとする。
これは少なくとも以下のような簡単な手順で再現できることがわかっている。
再現例)
1.エクスプローラから 物理フォルダ wwwroot\foo\bar を作成する。
2.IIS管理ツールから /foo/bar のプロパティを表示し、
“ディレクトリ”タブでアプリケーションを構成する(作成ボタンを押す)
3.エクスプローラから 物理フォルダ wwwroot\foo を削除する(1個上)
これだけで以下のような不整合が起き、特に ASP.net での開発に支障が出たりするのだ。
Root (IIsWebVirtualDir)
(略)
foo (IIsWebDirectory) ← 削除したのに表示される(「既にある」と怒られる)
bar (IIsWebDirectory) ← 存在しないのに表示される(「既にある」と怒られる)
ちなみに、IIS管理ツールから手順3を行う場合には問題は出ないようだ。
なお、肝心のこの不整合な状態をきれいにする方法だが、一気に行う方法は見つけていない。
残念ながら XP-Professionalでインストールされる AdminScripts にはそれに該当するものは存在しない。
(IISのバージョンや、インストール先のOSの種類(server/professional)によって変わるかもしれない)
ということで、今のところはいったん不整合となったフォルダ構成は手作業で再現しなおして、
IIS管理ツールから再び削除していく。という地道な方法しかないんじゃなかろうか?
もっといい方法があれば誰か教えて(またか)