Прежде всего, не используйте API совместимости IIS6 для управления сопоставлениями обработчиков IIS7. Вместо этого используйте управляемый API Microsoft.Web.Administration
.
Тем не менее, вы делаете это совершенно неправильно. Вам не следует прикасаться к сопоставлениям обработчиков, вместо этого измените управляемую версию среды выполнения для пула приложений, в котором находится приложение.
Добавить ссылку на:
C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll
Тогда в вашем коде:
using Microsoft.Web.Administration;
...
using (ServerManager serverManager = new ServerManager())
{
ApplicationPool appPool =
serverManager.ApplicationPools.Where(a => a.Name.Equals(appPoolName))
.Single();
appPool.ManagedRuntimeVersion = "v2.0";
serverManager.CommitChanges();
}
Я бы также рекомендовал НЕ использовать API-интерфейсы совместимости ADSI для манипулирования конфигурацией IIS7. Научитесь любить и обнимать <applicationHost>
и забыть о мышлении в терминах объектов метабазы в IIS7:
http://www.iis.net/ConfigReference/system.applicationHost
Обновление:
В дополнение к вашему вопросу о наличии кода, который работает как с IIS6, так и с IIS7, я бы настоятельно рекомендовал НЕ использовать уровень совместимости IIS6 для удобства поддержки только одной кодовой базы.
Причина этого заключается в том, что функции объектов IIS7, таких как HandlerMappings (эквивалент Script Mappings), обрабатываются по-разному. Компонент совместимости создает так называемые объекты ABO Custom Map, которые теряют некоторые преимущества правильных HandlerMappings. Пока они работают, они создадут административный кошмар в долгосрочной перспективе. Поверь мне, я был там.
Если вам нужно определить, какую версию IIS вы используете, вот удобная функция для этого:
public static int GetIIsMajorVersion()
{
string regKey = @"SOFTWARE\Microsoft\InetStp";
using(RegistryKey key = Registry.LocalMachine.OpenSubKey(regKey, true))
{
return Convert.ToInt32(key.GetValue("MajorVersion"));
}
}
Если возвращаемое значение равно 6, то это IIS6, если это 7, то вы находитесь на IIS 7.x.