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

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

1) У меня есть приложение ASP.NET, у которого есть класс Preloader, который наследует IProcessHostPreloadClient и выполняет всю тяжелую инициализацию в реализации метода Preload (приложение является сложным и является частью огромной системы, поэтому для установления соединений со всеми необходимыми службами требуется примерно 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 из кода), но эта проблема будет ошибкой, так как у меня даже нет идеи, что неправильно.

Ответ 1

Проблема

Вы используете 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 отправляет запрос "получить" на ваш сайт после запуска пула приложений.

Ответ 2

Попробуйте перерегистрировать 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

Ответ 3

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

Перейдите в "включить или отключить функции Windows" Затем Internet Information Services Затем World Wide Web Services Затем функции разработки приложений А затем включите ASP.NET 4.5

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

Ответ 4

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

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

Ответ 5

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

Для 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

Ответ 6

Для 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. Не уверен, правильно ли указано имя функции, но оно сработало для меня.

Ответ 7

Этот fooobar.com/questions/31189/... работает отлично. Но если у вас есть 64-битная операционная система, используйте Framework64 вместо Framework в пути:

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

Ответ 8

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

Ответ 9

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

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

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

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

  • Найдите aspnet_regiis в папке, подобной этому пути. c:\Windows\Microsoft.NET\Framework\v4.0.30319\

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

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

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

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

Ответ 10

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

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

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

Ответ 11

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

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

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

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

Ответ 12

Убедитесь, что вы установили версию 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 и наслаждайтесь.

Ответ 13

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

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

Ответ 14

Эта ошибка начала происходить со мной из ниоткуда прошлой недели, затрагивая существующие веб-сайты на моей машине. Мне не повезло с этим, чтобы попробовать какие-либо предложения здесь. В конце концов я полностью удалил WebDAV из IIS (Windows Features → Internet Information Services → World Wide Web Services → Общие функции HTTP → Публикация WebDAV). После этого я сделал IIS reset для хорошей оценки, и моя ошибка была окончательно решена.

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

Ответ 15

Я работаю над Windows Server 2012. Функция .NET Extensibility 4.5 включена. Удалено WebDAVModule. Я по-прежнему получал ошибку 500.21 на маршруте/документах ASP.NET.

Изменение "skipManagedModules" на false устраняет проблему.

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

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

Ответ 16

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

enter image description here

Ответ 17

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

Ответ 18

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

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

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

  • Нажмите на удаленный пул приложений
  • Найти WebDAV Authoring Tools в списке
  • Нажмите, чтобы открыть его
  • Нажмите Disable WebDAV в верхнем правом углу.

Ta daaaa!

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

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

Эта ссылка содержит инструкции, но это не очень понятно.

Ответ 19

Это, возможно, не полезное решение для 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, маршрутизация на пейджинг управляется модулями!!!

Ответ 20

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

Мне пришлось использовать Web Platform Installer и установить следующие пакеты:

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

Ответ 21

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

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