Как мне аккуратно манипулировать сопоставлениями обработчиков в IIS7, используя пространство имен Microsoft.Web.Administration?

StackOverflow https://stackoverflow.com/questions/1671702

  •  13-09-2019
  •  | 
  •  

Вопрос

При манипулировании сопоставлениями Обработчиков с использованием Microsoft.Web.Administration пространство имен, есть ли способ удалить <remove name="handler name"> на уровне сайта.

Например, у меня есть сайт, который наследует все сопоставления обработчиков из конфигурации глобальных сопоставлений обработчиков.В applicationHost.config тот самый <location> тег изначально выглядит следующим образом:

<location path="60030 - testsite-60030.com">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication userName="" />
      </authentication>
    </security>
  </system.webServer>
</location>

Чтобы удалить обработчик, я использую код, подобный этому:

string siteName = "60030 - testsite-60030.com";
string handlerToRemove = "ASPClassic";

using(ServerManager sm = new ServerManager())
{
  Configuration siteConfig = 
    serverManager.GetApplicationHostConfiguration();
  ConfigurationSection handlersSection = 
    siteConfig.GetSection("system.webServer/handlers", siteName);
  ConfigurationElementCollection handlersCollection = 
    handlersSection.GetCollection();

  ConfigurationElement handlerElement = handlersCollection
    .Where(h => h["name"].Equals(handlerMapping.Name)).Single();

  handlersCollection.Remove(handlerElement);
}

Это приводит к тому, что сайт <location> тег выглядит как:

<location path="60030 - testsite-60030.com">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication userName="" />
      </authentication>
    </security>    
    <handlers>
      <remove name="ASPClassic" />
    </handlers>
  </system.webServer>
</location>

Пока все идет хорошо.Однако, если я повторно добавлю ASPClassic обработчик это приводит к:

<location path="60030 - testsite-60030.com">
  <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication userName="" />
      </authentication>
    </security>    
    <handlers>
      <remove name="ASPClassic" />
      <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
    </handlers>
  </system.webServer>
</location>

Это может привести к большому количеству проблем с течением времени для каждого веб-сайта, на котором обработчик был удален, а затем повторно добавлен программно.Есть ли способ просто удалить <remove name="ASPClassic" /> используя код пространства имен Microsoft.Web.Administration?

Это было полезно?

Решение

Я обсуждал это с командой разработчиков IIS, и, похоже, это ошибка в системе настройки.Что еще интереснее, так это то, что когда я пытаюсь выполнить этот код на Win7 с IIS 7.5, я не могу даже повторно добавить обработчик программно.Попытка сделать это приводит к исключению COM, которое гласит:

"Ошибка:Не удается добавить дублирующуюся запись коллекции типа "добавить" с уникальным ключевым атрибутом "name", установленным в "ASPClassic""

Это становится еще более проблематичным, потому что, как только пользователь "удалил" обработчик для местоположения, он не может быть повторно добавлен через M.W.A.API до тех пор, пока эта ошибка не будет исправлена.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top