Обработчик «ExtensionlessUrlHandler-Integrated-4.0» имеет неверный модуль «ManagedPipelineHandler» в своем списке модулей

252

Честно говоря, я попытался сделать грязную уловку с IIS, и когда я подумал, что мне это сойдет с рук, я понял, что мой обходной путь не работает. Вот что я пытался сделать:

1) У меня есть приложение ASP.NET , который имеет Preloader класс , который наследует IProcessHostPreloadClient и делает все инициализацию тяжелый в натяг реализации метода (приложение является сложным , и это является частью огромной системы, поэтому она требует около 2 минут , чтобы установить связи с всем необходимым услуги и предварительно создать некоторые регистрации Unity).

2) У меня есть много работы, которую необходимо выполнить при завершении работы приложения (отписаться, отсоединить, удалить, ...), и я думаю, что лучшее место для этого - метод * Application_End *, расположенный в Global.asax .

3) Все работает очень хорошо, когда у меня есть пользовательская активность (первый запрос после запуска пула приложений, который содержит вышеупомянутое веб-приложение, вызовет * Application_Start *, а затем * Application_End * будет вызван при остановке или перезапуске пула приложений), но проблемы происходят, когда нет активности пользователя, и приложение пытается перезапустить себя после активности в течение 48 часов (настроенное требование). Поскольку запросов не было, приложение официально не запускалось. Ergo, его нельзя остановить изящно, так как * Application_End * не будет вызван.

4) Теперь начинается беспорядочная часть ... Я попытался сделать GET-запрос из кода в конце метода Preload , и это сработало. Но это решение показалось мне плохим, хотя и сработало. Итак, я попробовал много вещей, и последнее, что я попробовал, это:

SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);

... и это сделало его цель. * Application_Start * был вызван (я проверил ответ, он содержал страницу входа в систему, которая должна была отображаться в первоначальном запросе), и при завершении работы приложения пул приложений завершился изящно, выполнив необходимую работу в * Application_End *.

НО

После того, как приложение было запущено (предварительно загружено и инициировано) таким образом, вот что произошло, когда я хотел получить доступ к приложению через веб-браузер:

Ошибка HTTP 500.21 - Внутренний обработчик ошибок сервера «ExtensionlessUrlHandler-Integrated-4.0» имеет неверный модуль «ManagedPipelineHandler» в своем списке модулей

Я не могу понять это. Кто-нибудь может сказать мне, почему это происходит и как это исправить?

Если я не пойму это, я вернусь к первому решению (отправив запрос GET из кода), но эта проблема вызовет у меня ошибку, так как я даже не представляю, в чем дело.

Иван Перич
источник
какую версию IIS вы используете?
Чи х
IIS 7.5 (7.5.7600.16385)
Иван Перич
Не прямой ответ на ваш вопрос, но для других пользователей, имеющих аналогичную проблему и предполагающих, что у вас есть интернет-приложение: вы можете просто использовать внешний сервис, такой как uptimerobot.com, чтобы обращаться к вашему приложению каждые X раз. Вы поддерживаете приложение в рабочем состоянии + у вас есть дополнительные преимущества сервиса (время работы, оповещения и т. Д.).
qbantek
@qbantek Несмотря на то, что приложение, над которым я работаю, не имеет отношения к Интернету, вы дали мне хорошую идею. Я мог бы использовать балансировщик нагрузки для периодического касания, установив тип проверки состояния работоспособности на Simple HTTP GET. Спасибо
Иван Перич

Ответы:

24

Эта проблема

Вы используете SimpleWorkerRequest в сценарии, для которого он не предназначен. Вы используете его внутри IIS . Если вы посмотрите на предыдущую ссылку MSDN (выделено мое):

Предоставляет простую реализацию абстрактного класса HttpWorkerRequest, который можно использовать для размещения приложений ASP.NET вне приложения служб IIS . Вы можете использовать SimpleWorkerRequest напрямую или расширить его.

Кроме того, если вы посмотрите документацию MSDN для пространства имен System.Web.Hosting ( SimpleWorkerRequestнаходится в этом пространстве имен), вы также увидите нечто похожее на приведенное выше (опять же, выделение мое):

Пространство имен System.Web.Hosting обеспечивает функциональность для размещения приложений ASP.NET из управляемых приложений вне Microsoft Internet Information Services (IIS) .

Решение

Я бы порекомендовал удалить звонок на SimpleWorkerRequest. Вместо этого вы можете использовать решение Microsoft, чтобы обеспечить автоматический запуск вашего веб-сайта после его перезагрузки. Вам нужен модуль инициализации приложения Microsoft для IIS 7.5 . Это не сложно настроить, но вы должны понимать точные параметры. Вот почему я также рекомендовал бы интерфейс инициализации приложения для IIS 7.5 . Пользовательский интерфейс написан блоггером MSDN.

Так что именно делает решение Microsoft? Он делает то, что вы пытаетесь сделать - IIS отправляет запрос «get» на ваш веб-сайт после запуска пула приложений.

чи х
источник
2
Я прыгал, чтобы найти решение, которое может быть реализовано в коде, но оно настолько близко к «достаточно хорошему», насколько это возможно, поэтому я присуждаю ему награду. Но я думаю, что решение, предоставленное @danijelk, будет наиболее полезным для большинства людей, которые сталкиваются с этим вопросом по причинам, отличным от указанных мной. Так что это записка для них, чтобы взглянуть на это.
Иван Перич
650

Попробуйте перерегистрировать ASP.NET в aspnet_regiis -i. Это сработало для меня.

Вероятный путь для .NET 4 (из командной строки с повышенными правами):

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

http://forums.iis.net/p/1190643/2026401.aspx

danijelk
источник
Спасибо за ваш ответ. Я уже попробовал это, и это не сработало. :( -
Усама Ходрог
8
Не работает для Windows Server 2012. Прочтите сообщение Заха на этой странице.
Иван Акчеуров
Спасибо. Я работал над этим на виртуальной машине в Azure. Однако я хотел бы знать, почему я должен делать это при новой установке. Конечно, ASPNET регистрируется, когда он устанавливается правильно? Я думаю, это как-то связано с порядком установки.
Дэвид Бридж
4
Если вы используете .NET 4.5.x или 4.6.x, не обманывайте себя ответом, в котором упоминается 4.0, и думайте, что он к вам не относится. Эта проблема может быть связана с порядком установки .NET перед IIS, как это было для меня. Выполнение команды (в моем случае 64-разрядная версия) исправило ее, хотя мое приложение использует .NET 4.5.2.
Кокси
Windows 2008, новая установка микросервера AWS потребовала, чтобы я выполнил эту команду ... Только для тех из нас, кто считает, что это не имеет отношения к их системе.
terary
170

Если вы столкнулись с этой ошибкой в ​​Windows 8 / Windows Server 2012 и .Net 4.5, следуйте этим инструкциям здесь: http://www.britishdeveloper.co.uk/2013/01/handler-extensionlessurlhandler.html

Перейдите к пункту «Включение или отключение функций Windows», затем к «Информационным службам Интернета», «Службам всемирной паутины», затем к функциям разработки приложений и затем включите ASP.NET 4.5.

Это сработало для меня (хотя мастер и формулировка немного отличаются в Windows Server 2012, но вы поймете это). С учетом вышесказанного, почему это необходимо после установки всего через установщик веб-платформы, включая все зависимости, полностью вне моего понимания ...

Zach
источник
3
Настройка Windows Server является PITA. Почему нет центральной системы управления пакетами?
Кугель,
если вы установили iis с веб-платформой, проверьте комментарий Virgo139, это легко решило мою проблему
castors33
Это было исправлением для меня на Windows 10 Pro build 1607, ура!
Апогей
Это исправило это и для меня в Windows 10. Стоит отметить, что общее исправление командной строки (aspnet_regiis.exe -i) не разрешено в Windows 10.
Nat Webb
Подтвержденное решение для Windows 10 Pro.
Zoomzoom
59

Несмотря на то, что я следовал большинству советов на этой странице, у меня все еще возникали проблемы в Windows Server 2012. Установка .NET Extensibility 4.5 решила эту проблему для меня:

Add Roles and Features > Server Roles > Web Server (IIS) > Web Server > Application Development > .NET Extensibility 4.5

Джонатан
источник
2
Спасибо за разъяснение, я слишком долго смотрел на Веб-сервер -> Веб-сервер ->
Канал
2
Не забудьте проверить Роли и функции> Роли сервера> Веб-сервер (IIS)> Веб-сервер> Разработка приложений> ASP.NET 4.6 (или 4.5 в зависимости от вашей настройки)
Lionet Chen
1
Да, затем перезагрузите службу IIS. Работал на меня! Спасибо. +1
Rusty Nail
47

Для Windows 10 / Windows Server 2016 используйте следующую команду:

dism /online /enable-feature /featurename:IIS-ASPNET45 /all

Предложенные ответы с aspnet_regiisне работают в Windows 10 (Creators Update и более поздних версиях) или Windows Server 2016:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_regiis.exe -i
Microsoft (R) ASP.NET RegIIS версия 4.0.30319.0
Утилита администрирования для установки и удаления ASP.NET на локальном компьютере.
Авторское право (C) Microsoft Corporation. Все права защищены.
Начните установку ASP.NET (4.0.30319.0).
Эта опция не поддерживается в этой версии операционной системы. Вместо этого администраторам следует установить / удалить ASP.NET 4.5 с IIS8, используя диалоговое окно «Включение / выключение компонентов Windows», средство управления диспетчером сервера или средство командной строки dism.exe. Для получения дополнительной информации см. Http://go.microsoft.com/fwlink/?LinkID=216771 .
Закончена установка ASP.NET (4.0.30319.0).

Интересно, что диалоговое окно «Включить / выключить функции Windows» не позволило мне снять флажки .NET или ASP.NET 4.6, и сработала только вышеуказанная команда DISM. Не уверен, правильно ли указано имя функции , но у меня это сработало.

Барт Verkoeijen
источник
Это исправило это для меня, я работал под управлением Windows 10 Pro с обновлением создателя. Спасибо!
Самуэль Пуарье
Легендарный ответ! Мне пришлось перестраивать свой веб-сервер, и я не обновлял сценарии в течение нескольких лет, я добавил эту команду DISM в свои сценарии подготовки виртуальных машин, это работает как чудо.
Крис Шаллер,
dism / online / enable-feature / featurename: IIS-ASPNET45 / all Работал для меня в Windows Server 2016
Сайед Насир Аббас
Благодаря тебе у меня еще есть работа! :) Работал.
Скотт
42

Запустите одну из следующих команд:

Для 32-битной ОС Windows:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

Для 64-битной ОС Windows:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -I
user3896335
источник
При этом я заметил, что папка «aspnet_client» добавляется на веб-сайт в каталоге «Сайты» IIS Connections
eaglei22,
26

Этот https://stackoverflow.com/a/13266763/1277458 работает отлично. Но если у вас 64-битная операционная система, используйте Framework64 вместо Framework в пути:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
Нешта
источник
FWIW, Server 2012 R2 говорит, что этот параметр не поддерживается, и предлагает использовать диалоговое окно Feature для включения ASP.NET 4.5
2015 г.
Да, ответ Зака ​​покрывает это.
Нешта
13

В моем случае (Windows 10 + IIS 10) мне пришлось открыть « Включение или отключение компонентов Windows », а затем перейти к службам IIS> Службы всемирной паутины> Функции разработки приложений> и проверить ASP.NET 4.6.

Xaris Fytrakis
источник
1
Мой был IIS на Windows 2012 R2. Добавлен совместимый ASP.NET в Диспетчер серверов> Управление> Добавить роли и компоненты> Установка на основе ролей или компонентов> (выберите сервер)> Веб-сервер (IIS)> Веб-сервер> Разработка приложений> ASP.NET 4.5. Как сказал @ArsmanAhmad, хорошая проверка работоспособности состоит в том, чтобы проверить, установлена ​​ли ваша версия пула приложений .NET CLR на v4.0.
ГБУ
6

Создание этого собственного поста, потому что это заставило меня идти часами.

Я видел около десятка подобных сообщений здесь и в других местах об этой проблеме и исправлении aspnet_regiis. Они не работали для меня, и aspnet_regiis действовал странно, просто перечислял опции и т. Д.

Как указано выше пользователем ryan-anderson, вы не можете войти в .exe

Для тех, кто менее удобен для вещей вне IIS на сервере, вот что вы делаете в простых шагах.

  1. Найдите aspnet_regiis в папке, похожей на этот путь. C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \

  2. Щелкните правой кнопкой мыши командную строку в меню «Пуск» или в любом другом месте и скажите, чтобы она запускалась от имени администратора. Использование функции «Выполнить» в Windows просто не будет работать или не работает для меня.

  3. Вернитесь к исполняемому файлу aspnet_regiis. Нажмите и перетащите его прямо в командную строку или скопируйте и вставьте адрес в командную строку.

  4. Удалите, если он есть, .exe в конце. Это ключ. Добавьте -i (пробел минус глаз) в конце. Войти.

Если вы сделали это правильно, вы увидите, что он начинает устанавливать asp.net, а затем сообщает, что это удалось.

Шуб-Ниггурат
источник
Работал отлично для меня. Спасибо.
Майк
5

Убедитесь , что вы установили application-siteверсию с v2.0к v4.0в диспетчере IIS :

Пулы приложений> Ваше приложение> Дополнительные параметры> Версия .NET Framework

После этого установите свой ASP.NET.

Для 32-битной ОС (Windows):

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_regiis.exe -i

Для 64-битной ОС (Windows):

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet_regiis.exe -i

Перезапустите application-siteв IIS Manager и наслаждайтесь.

Арсман Ахмад
источник
Да, я изо всех сил старался сделать ответ максимально простым. ;-) @yuyangJian
Арсман Ахмад
4

Я знаю, что это старенький, но подумал, что мог бы добавить некоторую ценность. Для тех из нас, кто работает с Server Core за пределами домена (члены домена могут просто запускать Server Manager удаленно для добавления / удаления функций / ролей), вам следует прибегнуть к командной строке.

Пользователи Powershell могут ввести «Install-WindowsFeature Web-Asp-Net45»

Это должно быть эквивалентно использованию диспетчера сервера.

jwdaigle
источник
4

Мне было выдвинуто то же сообщение об ошибке с установленным .net 4.7.

Решение состояло в том, чтобы следовать одному из ранее упомянутых постов, чтобы включить функцию «Включение или отключение Windows», где «.NET Framework 4.7 Advanced Services» -> «ASP.NET 4.7» уже была проверена.

Далее по списку есть «Информационные службы Интернета» и сноска «Функции разработки приложений» -> «ASP.NET 4.7», которые также необходимо проверить.

При включении этого, все другие функции включены ... Я просто нажал кнопку ОК, и проблема была решена. Скриншот диалога окон

theodor.johannesen
источник
Я должен добавить, что это была версия для Windows 10 pro
theodor.johannesen
2

Я работаю на Windows Server 2012. Включена функция .NET Extensibility 4.5. WebDAVModule удален. Я все еще получал ошибку 500.21 на маршруте ASP.NET '/ docs'.

Изменение 'skipManagedModules' на false решило проблему.

<applicationInitialization doAppInitAfterRestart="true" skipManagedModules="false">
        <add initializationPage="/docs" />    
</applicationInitialization>

Благодаря https://groups.google.com/forum/#!topic/bonobo-git-server/GbdMXdDO4tI

shemanov
источник
2

Я решил эту проблему, добавив в «Включить или отключить функции Windows» параметр ASP.NET 4.7.

введите описание изображения здесь

Эдгар Чивичон
источник
1

У меня возникла эта проблема, и я обнаружил, что удаление следующей папки помогло, даже с не-Express Edition. Express:

C:\Users\<user>\Documents\IISExpress

Томас Братт
источник
1

Эта ошибка начала происходить со мной из ниоткуда на прошлой неделе, затрагивая существующие веб-сайты на моем компьютере. Мне не повезло с этим, попробовав любое из предложений здесь. В конце концов я полностью удалил WebDAV из IIS (Функции Windows -> Информационные службы Интернета -> Службы всемирной паутины -> Общие функции HTTP -> Публикация в WebDAV). Я сделал сброс IIS после этого для хорошей меры, и моя ошибка была наконец решена.

Я могу только догадываться, что обновление Windows начало проблему, но я не могу быть уверен.

pirsqua
источник
Просто была такая же проблема. Установил некоторые обновления Windows, которые переключались вокруг моих настроек IIS. Отключение WebDAV Publishing исправило это снова.
ElliotSchmelliot
0

Вы можете исправить это, изменив тип «ExtensionlessUrlHandler-Integrated-4.0» в iis на System.Web.DefaultHttpHandler

user3661608
источник
0

Для меня удаление WebDAV с моего сервера заставило приложение возвращать 503 Service Unavailableсообщение об ошибке при использовании PUTили DELETE, поэтому я переустановил его снова. Я также попытался полностью удалить .NET Framework 4.5 и переустановить его, а также попытался заново зарегистрироваться, как это было предложено, но безрезультатно.

Мне удалось это исправить, отключив WebDAV для отдельного пула приложений, это остановило ошибку «плохой модуль» при использовании PUTили DELETE.

Отключить WebDAV для отдельного пула приложений:

  1. Щелкните по уязвимому пулу приложений.
  2. Найти WebDAV Authoring Toolsв списке
  3. Нажмите, чтобы открыть его
  4. Нажмите Disable WebDAVв правом верхнем углу.

Та даааа!

Я все еще оставил элементы удаления в моем web.configфайле.

 <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
    </handlers>
 <system.webServer>

По этой ссылке я нашел инструкции, но не очень понятно.

Люк
источник
0

Возможно, это не очень полезное решение для OP, но оно касается того же сообщения об ошибке.

Мы размещаем страницы PHP на IIS8.5 с правильно установленной .NET 4.5.

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

Через некоторое время мы начали получать эту ошибку наугад.

В web.config: я установил skipManagedModules в true, -> не делай этого!

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
<applicationInitialization skipManagedModules="false" doAppInitAfterRestart="true">
  <add initializationPage="/" />
</applicationInitialization>
...

Хотя сайт php, маршрутизация на пейджинг управляется модулями !!!

Schwarzie2478
источник
0

Я тоже столкнулся с этой проблемой. Мое приложение MVC4 работает на Windows Server 2012 R2 с IIS 8.5. Ни одно из этих опубликованных решений не помогло мне ... установка отсутствующих платформ с помощью функций IIS могла бы решить эту проблему, но установка всегда заканчивалась неудачей.

Я должен был использовать Web Platform Installerи установил следующие пакеты:

введите описание изображения здесь

Фрэнк
источник
0

Я столкнулся с этой проблемой в веб-приложении, размещенном на сервере общего хостинга. Таким образом, очевидно, не было прямого доступа к IIS, поэтому не могли применить многие решения, предложенные здесь.

На панели управления хостинг-провайдера я включил ведение журнала ошибок для IIS и ASP.Net. А потом узнал, что ошибка на самом деле лежит в недостающем cshtml.

Дипенду Пол
источник
0

Установка .NET 4.7 работала для меня. У меня был только 3,5 установлен ранее.введите описание изображения здесь

Эрик С.
источник