Файл IIS 7.5 applicationHost.config не обновляется

#iis-7.5 #mime-types #applicationhost

#iis-7.5 #mime-типы #applicationhost

Вопрос:

В настоящее время я играю с пространством имен Microsoft.Web.Administration (MWA), чтобы настроить наше приложение для настройки IIS 7.5 с новым API. Я понял, что все изменения на уровне IIS должны быть выражены в следующем файле (я на Win2K8-R2):

%WINDIR%System32inetsrv configapplicationHost.config

Итак, когда я использую ServerManager объект для фиксации изменений конфигурации, файл должен быть соответствующим образом обновлен.

После добавления нового типа MIME (программного с помощью MWA) я не увидел никаких изменений в applicationHost.config file , но я вижу новый тип MIME в окне диспетчера IIS, и IIS распознает этот тип MIME без проблем. Даже после повторной настройки операционной системы Файл конфигурации не содержит недавно добавленный тип MIME, но в окне диспетчера IIS он отображается.

Поскольку мои пулы приложений принудительно переведены в 32-разрядную версию ( Enable32BitAppOnWin64 = true ), я подумал, что соответствующий файл конфигурации должен быть расположен под %WINDIR%SysWOW64inetsrvConfig , но (если он существует …) — он также не изменяется после фиксации обновлений кодом.

Может кто-нибудь, пожалуйста, объяснить это? Я что-то упускаю (возможно, просматриваю не тот файл?)? Может кто-нибудь, пожалуйста, пролить свет на SysWOW64inetsrvconfig каталог?

Это мой код для добавления типа MIME:

 ServerManager manager = new ServerManager();
ConfigurationElementCollection staticContentCollection = manager
    .GetApplicationHostConfiguration()
    .GetSection("system.webServer/staticContent")
    .GetCollection();

//MIMETypes is a string[] array, each object is {FileExt},{MIMETypeStr}
foreach (string pair in MIMETypes)
{
    string[] mimeProps = pair.Split(',');

    ConfigurationElement mimeTypeEl = staticContentCollection
          .Where(a => 
                   (string)a.Attributes["fileExtension"].Value == mimeProps[0])
          .FirstOrDefault();


    if (mimeTypeEl != null)
    {
        staticContentCollection.Remove(mimeTypeEl);
    }

    ConfigurationElement mimeMapElement = 
                  staticContentCollection.CreateElement("mimeMap");

    mimeMapElement["fileExtension"] = mimeProps[0];
    mimeMapElement["mimeType"] = mimeProps[1];

    staticContentCollection.Add(mimeMapElement);
}

manager.CommitChanges();

//At this point all is working but the config file does not reflect the change
  

Ответ №1:

Я только что попробовал ваш код, и он работает нормально. Вам известно, что этот тип mime добавляется в глобальную коллекцию типов mime, а не на сайт?

Он также добавляется в конец <staticContent> списка, этот список не сортируется повторно, когда вы это делаете ServerManager.CommitChanges() .

Также в Windows 2008-R2 правильное расположение для applicationHost.config находится по адресу:

C:WindowsSystem32inetsrvconfig

Я предполагаю, что вы либо используете notepad.exe или NotePad2, чтобы открыть этот файл (32-разрядные редакторы не могут его открыть). Notepad не будет перезагружать файл при изменении, и NotePad2 нужно указать, чтобы отображалось уведомление об изменении файла (alt-F5), из коробки этого не будет.

Также попробуйте добавить что-нибудь необычное, например .xxx , запустите обновление, затем откройте файл конфигурации и выполните поиск. Я гарантирую, что он будет там.

Обновить:

В дополнение к вашим комментариям ниже, я не уверен, как вы можете открыть, applicationHost.config используя NotePad или любой 32-разрядный редактор, я, конечно, не могу. Можете ли вы загрузить NotePad2, который является 64-разрядным редактором:

http://www.flos-freeware.ch/notepad2.html

Кандидат на выпуск работает просто отлично.

При установке по умолчанию любой 64-разрядной версии Windows 2008 или Windows 7 applicationHost.config в C:WindowsSysWOW64inetsrvConfig папке не должно быть an. Я не уверен, почему вы его там видите.

Комментарии:

1. Я проверил это снова, уделив особое внимание программе просмотра текста. Если я открою файл конфигурации с помощью Notepad или VS2010 (оба 32-разрядные) — изменений там нет. Но… Если я открою файл с помощью собственного приложения Notepad (64-разрядный), изменения будут там! Что-то здесь не в порядке… Похоже, перенаправление FS ( msdn.microsoft.com/en-us/library/aa384187 (v = vs. 85).aspx ) или эта проблема: support.microsoft.com/kb/942589 , почему-то не очень хорошо воспроизводятся… Есть предложения по 64-разрядному текстовому редактору?

2. Существует также хакерский способ открытия файла applicationHost.config в 32-разрядных приложениях путем злоупотребления UNC-путями. Вместо перехода к каталогу на диске используйте путь UNC (например, \192.168.1.100C $Windows System32inetsrvconfig).

3. Редактирование файла с использованием 64-разрядного редактора вместо 32-разрядного редактора — это новый уровень вуду.

4. @Kev: Самая полезная вещь, которую я прочитал за весь день. Кто бы мог подумать, что использование 32-разрядного приложения не приведет к правильному открытию / сохранению.

5. Другой способ получить доступ к этому файлу без использования пути UNC — это использовать системный псевдоним : notepad %SystemRoot%SysnativeinetsrvconfigapplicationHost.config (Вы не можете перейти к этому пути с помощью Explorer, потому что он виден только 32-разрядным приложениям)

Ответ №2:

В качестве обходного пути для открытия и редактирования 64-разрядных файлов конфигурации IIS с помощью вашего любимого 32-разрядного редактора, совместимого с 64-разрядной версией (например, Notepad ), вы можете создать символическую ссылку на каталог Windows, которая указывает на C:WindowsSystem32inetsrvConfig . С помощью этого метода вы заменяете 32-разрядный Config каталог, расположенный по адресу C:WindowsSysWOW64inetsrvConfig , чтобы указать на 64-разрядную версию. Если, например, у вас есть приложение, для которого требуются как 32-разрядные, так и 64-разрядные версии, этот метод не будет работать.

Для получения дополнительной информации я настоятельно рекомендую вам посетить этот блог MSDN.