Файл приложения IIS 7.5 applicationHost.config не обновляется
В настоящее время я играю с пространством имен Microsoft.Web.Administration(MWA), чтобы настроить наше приложение для настройки IIS 7.5 с помощью нового API.
Я понял, что все изменения уровня IIS должны быть выражены в следующем файле (я нахожусь на Win2K8-R2):
%WINDIR%\System32\inetsrv\config\applicationHost.config
Итак, когда я использую объект ServerManager
для фиксации изменений конфигурации, файл должен быть соответствующим образом обновлен.
После добавления нового типа MIME (программный с MWA) я не видел никаких изменений в applicationHost.config file
, но я вижу новый тип MIME в окне диспетчера IIS, и IIS без проблем распознает этот тип MIME. Даже после перезагрузки ОС - Файл конфигурации не содержит вновь добавленный тип MIME, но окно диспетчера IIS перечисляет его.
Поскольку мои пулы приложений вынуждены 32-разрядные (Enable32BitAppOnWin64 = true
), я думал, что связанный файл конфигурации должен находиться в %WINDIR%\SysWOW64\inetsrv\Config
, но (если он существует...) - он также не изменяется после код фиксирует обновления.
Может кто-нибудь объяснить это? Я что-то пропустил (возможно, посмотрел на неправильный файл?)? Может кто-нибудь пролить свет на каталог SysWOW64\inetsrv\config
?
Это мой код для добавления типа 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:\Windows\System32\inetsrv\config
Я предполагаю, что вы либо используете notepad.exe или NotePad2, чтобы открыть этот файл (32-разрядные редакторы не могут его открыть). Блокнот не перезагружает файл при изменении, а NotePad2 должно быть указано, что ему нужно отобразить уведомление об изменении файла (alt-F5), из которого оно не будет.
Также попробуйте добавить что-то необычное, например .xxx
, запустите свое обновление, затем откройте файл конфигурации и выполните поиск. Я гарантирую, что он будет там.
Update:
В дополнение к вашим комментариям ниже, я не уверен, как вы можете открыть applicationHost.config
с помощью NotePad ++ или любого 32-битного редактора, я, конечно, не могу. Можете ли вы загрузить NotePad2, который является 64-разрядным редактором:
http://www.flos-freeware.ch/notepad2.html
Кандидат на выпуск работает просто отлично.
При установке по умолчанию любой 64-разрядной версии Windows 2008 или Windows 7 не должно быть applicationHost.config
в папке C:\Windows\SysWOW64\inetsrv\Config
. Я не уверен, почему вы его там увидите.
Ответ 2
В качестве обходного пути для открытия и редактирования 64-битных файлов конфигурации IIS с вашим любимым 32-разрядным редактором, совместимым с 64-разрядной версией (например, Notepad ++), вы можете создать символическую ссылку каталога Windows, которая указывает на C:\Windows\System32\inetsrv\Config
. С помощью этого метода вы заменяете 32-разрядный каталог Config
, расположенный в C:\Windows\SysWOW64\inetsrv\Config
, чтобы указать на 64-разрядную версию. Если, например, у вас есть приложение, которое требует как 32-битной, так и 64-разрядной версий, этот метод не будет работать.
Для получения дополнительной информации я настоятельно рекомендую вам посетить этот блог MSDN.