この記事は、プログラムによるサイトの削除中に IIS サイトに関連付けられている情報が削除されない問題を解決するのに役立ちます。
元の製品バージョン: インターネット インフォメーション サービス
元の KB 番号: 3202096
現象
以下のシナリオについて考えてみます。
-
appcmd
またはバイナリによって公開されるマネージド API への呼び出しを使用して、サイトMicrosoft.Web.Administration
削除します。 - インターネット インフォメーション サービス (IIS) に新しいサイトを作成します。
- 新しいサイトでは、削除されたサイトのレガシ メタデータが引き続き使用されます。
このシナリオでは、新しく作成されたサイトにアクセスしようとすると、予期しない動作が発生します。 たとえば、Web ブラウザーで HTTP 503 - Service Unavailable エラー メッセージが表示される場合があります。
原因
この問題は、IIS の既存の Web サイトの削除操作が、 appcmd
または Microsoft.Web.Administration
API を使用してプログラムによって実行され、サイトが IIS サーバーの ApplicationHost.config ファイルの <CustomMetaData>
構成要素で定義されているレガシ プロパティを持っている場合に発生します。 このシナリオでは、サイトに関連する <CustomMetaData>
タグ内の情報は削除されません。 削除操作の後に同じ ID を持つ新しいサイトが作成された場合、この新しいサイトは古いサイトのレガシ プロパティに関連付けられます。
解決方法
IIS 管理コンソールを使用すると、 appcmd
や Microsoft.Web.Administration
の呼び出しを行う代わりに、Web サイトを削除できます。 このメソッドを使用すると、削除しようとしている Web サイトに関連付けられているカスタム レガシ プロパティがある場合も、IIS 構成ファイル (ApplicationHost.config) から削除されます。 この動作により、古い削除されたサイトの ID を再利用する同じサーバー上に作成した新しい Web サイトに、これらのプロパティが予期せず関連付けられるのを防ぐことができます。
何らかの理由でサイトをプログラムで削除する必要があり、IIS マネージャー コンソールを使用できない場合は、2 つの回避策のいずれかを追加して、 <CustomMetaData>
要素を介してサイトに関連付けられているレガシ プロパティに関する情報も削除されるようにすることができます。
回避策 1: appcmd コマンドを使用する
appcmd
を使用してサイトを削除する場合は、次のコマンドを実行して、サイトが IIS 構成に含まれている可能性があるレガシ プロパティを削除できます。
Appcmd clear config -section:customMetadata -[path='LM/W3SVC/<SiteID>']
Note
<SiteID>
パラメーターを、appcmd
コマンドを使用して削除したサイトの識別子に置き換えます。
回避策 2: Microsoft.Web.Administration への呼び出しを使用する
マネージド API 呼び出しを使用して Web サイトを削除 Microsoft.Web.Administration
場合は、Web サイトを削除した後に次のコードを追加して、IIS 構成の <CustomMetaData>
要素に含まれるレガシ プロパティもクリアできます。
string path = "LM/W3SVC/" + site.Id.ToString(CultureInfo.InvariantCulture);
string pathWithSlash = path + "/";
for (int i = customMetadata.Count - 1; i >= 0; i--) {
ConfigurationElement metadata = customMetadata[i];
string key = (string)metadata["path"];
if (key != null &&
(
key.Equals(path, StringComparison.OrdinalIgnoreCase) ||
key.StartsWith(pathWithSlash, StringComparison.OrdinalIgnoreCase))
)
{
customMetadata.RemoveAt(i);
}
}
Note
変数 site
は、 Microsoft.Web.Administration
API を使用して削除した Web サイトを表します。
再現手順
Windows Server の場合:
IIS 6 メタベース互換性機能をインストールします。
IIS マネージャーで、2 つ目の Web サイトを作成します。この WebTest を呼び出し 任意のアプリケーション プールで実行します。
コマンド ライン プロンプトを開き、
C:\inetpub\AdminScripts
に移動します。コマンド
adsutil.vbs SET w3svc/2/ServerSize "23"
を入力して、 ApplicationHost.config ファイルの W3SVC タグに次のセクションを追加します。<customMetadata> .... <key path="LM/W3SVC/2"> <property id="1018" dataType="DWord" userType="1" attributes="Inherit" value="23" /> </key> .... </customMetadata>
コマンド プロンプト内の
C:\windows\system32\inetsrv\
に移動します。コマンド
appcmd delete site WebTest
を実行します。サイトが削除された後も、構成のセクションは ApplicationHost.config に残ります。