Поделиться через


Сведения, связанные с сайтом IIS, не удаляются во время программного удаления сайта

Эта статья поможет устранить проблему, из-за которой информация, связанная с сайтом IIS, не удаляется во время программного удаления сайта.

Исходная версия продукта: службы IIS
Исходный номер базы знаний: 3202096

Симптомы

Рассмотрим следующий сценарий:

  • Вы удаляете сайт с помощью вызовов appcmd или управляемых API, предоставляемых двоичными файлами Microsoft.Web.Administration .
  • Вы создаете новый сайт в службы IIS (IIS).
  • Новый сайт по-прежнему использует устаревшие метаданные удаленного сайта.

В этом сценарии при попытке получить доступ к созданному сайту возникает непредвиденное поведение. Например, в веб-браузере может появиться сообщение об ошибке HTTP 503 — служба недоступна .

Причина

Проблема возникает, когда операция удаления для существующего веб-сайта в IIS выполняется программным способом с помощью appcmd или Microsoft.Web.Administration API, а также если сайт имеет устаревшие свойства, определенные в <CustomMetaData> элементе конфигурации файла конфигурации файла ApplicationHost.config сервера IIS. Сведения в теге <CustomMetaData> , относящееся к сайту, не удаляются в этом сценарии. Если новый сайт с тем же идентификатором создается после операции удаления, этот новый сайт связан с устаревшими свойствами старого сайта.

Решение

Консоль администрирования IIS можно использовать для удаления веб-сайта вместо вызова appcmd или Microsoft.Web.Administration. Этот метод гарантирует наличие пользовательских свойств прежних версий, связанных с веб-сайтом, который вы пытаетесь удалить, они также удаляются из файла конфигурации IIS (ApplicationHost.config). Это поведение предотвращает неожиданное связь этих свойств с новым веб-сайтом, создаваемым на том же сервере, который повторно использует идентификатор старого удаленного сайта.

Если вы должны программно удалить сайт по какой-либо причине и не можете использовать консоль диспетчера IIS, можно добавить один из двух обходных путей, чтобы убедиться, что сведения о устаревших свойствах, связанных с сайтом, через <CustomMetaData> элемент также удаляются.

Обходное решение 1. Использование команд appcmd

Если вы используете appcmd для удаления сайта, можно выполнить следующую команду, чтобы удалить все устаревшие свойства, которые сайт может иметь в конфигурации IIS:

Appcmd clear config -section:customMetadata -[path='LM/W3SVC/<SiteID>']

Примечание.

Замените <SiteID> параметр идентификатором сайта, который вы только что удалили с помощью appcmd команд.

Решение 2. Использование вызовов Microsoft.Web.Administration

При использовании вызовов управляемого API для Microsoft.Web.Administration удаления веб-сайта можно добавить следующий код после удаления веб-сайта, чтобы очистить устаревшие свойства, содержащиеся в <CustomMetaData> элементе конфигурации IIS:

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);
    }
}

Примечание.

Переменная site представляет веб-сайт, который вы только что удалили с помощью Microsoft.Web.Administration API.

Шаги для воспроизведения

В Windows Server:

  1. Установите функцию совместимости метабазы IIS 6.

  2. В диспетчере IIS создайте второй веб-сайт: вызовите этот WebTest и сделайте его выполнение в любом пуле приложений нужным.

  3. Откройте командную строку и перейдите к: C:\inetpub\AdminScripts

  4. Введите команду adsutil.vbs SET w3svc/2/ServerSize "23" , чтобы добавить следующий раздел в тег W3SVC в файле конфигурации ApplicationHost.config :

    <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.