Модификация сценариев / карт обработчиков программно - PullRequest
0 голосов
/ 22 марта 2011

У меня есть код для программного создания виртуального каталога.

Мне нужно отредактировать сопоставления обработчиков фреймворка 2.0 для использования .net 4.0 (в основном, запускать код .net 2.0 в .net 4.0 CLR).

Приведенный ниже код прекрасно работает на сервере win 2003, но на сервере Windows 2008 webservicefactoryHandler2.0 переименовывается в webservicefactoryHandler4.032_1245.

Я не знаю, как получить доступ / отредактировать это имя или, на самом деле, сохранить имя и просто изменить его значение на \Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll с \Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll.

Dim scriptMapVals As PropertyValueCollection = VDir.Properties("ScriptMaps")
Dim objScriptMaps As ArrayList = New ArrayList()
Dim frameworkVersion As String = "4.0.30319"
Dim versionRegex As Text.RegularExpressions.Regex = New Text.RegularExpressions.Regex("(?<=\\v)\d{1}\.\d{1}\.\d{1,5}(?=\\)")
''Assuming the version will always be something like n.n.nnnnn

Dim scriptMapVal As String
For Each scriptMapVal In scriptMapVals
  If scriptMapVal.Contains("Framework") AndAlso scriptMapVal.Contains("asmx") Then
      objScriptMaps.Add(Text.RegularExpressions.Regex.Replace(scriptMapVal, versionRegex.ToString, frameworkVersion))
  Else
      objScriptMaps.Add(scriptMapVal)
  End If
Next

VDir.Properties("ScriptMaps").Value = objScriptMaps.ToArray()
VDir.CommitChanges()

Обновление: @kev: То есть в основном вы говорите, что используете разные коды для разных версий IIS, верно? Ну, при использовании импорта "Microsoft.Web.Administration.dll", мне нужно упаковать его в мою сборку? или это часть всех устанавливаемых IIS7.0? Некоторые люди могут иметь IIS7.0 в Windows XP.

Спасибо галлы

1 Ответ

0 голосов
/ 25 марта 2011

Прежде всего, не используйте 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.

...