次の方法で共有


プログラムによるサイトの削除中に IIS サイトに関連付けられている情報が削除されない

この記事は、プログラムによるサイトの削除中に 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 管理コンソールを使用すると、 appcmdMicrosoft.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 の場合:

  1. IIS 6 メタベース互換性機能をインストールします。

  2. IIS マネージャーで、2 つ目の Web サイトを作成します。この WebTest を呼び出し 任意のアプリケーション プールで実行します。

  3. コマンド ライン プロンプトを開き、 C:\inetpub\AdminScriptsに移動します。

  4. コマンド 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>
    
  5. コマンド プロンプト内の C:\windows\system32\inetsrv\ に移動します。

  6. コマンド appcmd delete site WebTestを実行します。

  7. サイトが削除された後も、構成のセクションは ApplicationHost.config に残ります。