Честно говоря, я попытался превратить грязный трюк в 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 из кода), но эта проблема будет ошибкой, так как у меня даже нет идеи, что неправильно.
Проблема
Вы используете 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 отправляет запрос "получить" на ваш сайт после запуска пула приложений.
Попробуйте перерегистрировать ASP.NET с помощью aspnet_regiis -i
. Это сработало для меня.
Вероятный путь для .NET 4 (из командной строки с повышенными правами):
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Если вы столкнулись с этой ошибкой с 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 мастер и формулировка немного отличаются, но вы поймете это). С учетом сказанного, почему это необходимо после установки всего через установщик веб-платформы, в том числе все зависимости полностью вне меня...
Несмотря на то, что многие советы на этой странице остались, у меня все еще возникали проблемы с Windows Server 2012. Установка .NET Extensibility 4.5 (Добавить роли и функции > Роли серверa > Веб-сервер (IIS) > Веб-сервеp > Разработка приложений > .NET Extensibility 4.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
Этот https://stackoverflow.com/questions/13162545/handler-extensionlessurlhandler-integrated-4-0-has-a-bad-module-managedpipeli работает отлично. Но если у вас есть 64-битная операционная система, используйте Framework64 вместо Framework в пути:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
Для Windows Server 2016 используйте следующую команду:
dism /online /enable-feature /featurename:IIS-ASPNET45 /all
Рекомендуемые ответы с aspnet_regiis
не работают в 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. Все права защищены.
Запустите установку ASP.NET(4.0.30319.0).
Эта опция не поддерживается в этой версии операционной системы. Администраторы должны вместо этого установить/удалить ASP.NET 4.5 с помощью IIS8 с помощью диалогового окна "Включение/выключение Windows-функций", инструмента управления диспетчером сервера или инструмента командной строки dis.exe. Подробнее см. http://go.microsoft.com/fwlink/?LinkID=216771.
Завершена установка ASP.NET(4.0.30319.0).
Интересно, что в диалоговом окне "Включение/выключение Windows-функций" мне не удалось отключить .NET или ASP.NET 4.6, и работала только вышеприведенная команда DISM. Не уверен, правильное ли featurename, но это сработало для меня.
В моем случае (Windows 10 + IIS 10) мне пришлось открыть " Включить или отключить Windows-функции", а затем перейти в "Информационные службы Интернета" > "Всемирные веб-службы" > "Возможности разработки приложений" > проверить ASP.NET 4.6
Я знаю, что это старина, но я подумал, что могу добавить некоторую ценность. Для тех из нас, у которых работает серверное ядро вне домена (участники домена могут просто запускать диспетчер сервера удаленно, чтобы добавлять/удалять функции/роли), вам нужно обратиться к командам.
Пользователи Powershell могут ввести "Install-WindowsFeature Web-Asp-Net45"
Это должно быть эквивалентно использованию диспетчера сервера.
Создание этого собственного сообщения, потому что это заставило меня часами.
Я видел, возможно, дюжину подобных сообщений здесь и в других местах об этой проблеме и исправлении 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, а затем сообщает, что это удалось.
Убедитесь, что вы установили версию 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 и наслаждайтесь.
Я работаю над 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
Эта ошибка начала происходить со мной из ниоткуда прошлой недели, затрагивая существующие веб-сайты на моей машине. Мне не повезло с этим, чтобы попробовать какие-либо предложения здесь. В конце концов я полностью удалил WebDAV из IIS (Windows Features → Internet Information Services → World Wide Web Services → Общие функции HTTP → Публикация WebDAV). После этого я сделал IIS reset для хорошей оценки, и моя ошибка была окончательно решена.
Я могу только догадываться, что обновление Windows запустило проблему, но я не могу быть уверен.
У меня возникла эта проблема и выяснилось, что удаление следующей папки помогло, даже с не-Express edition.Express:
C:\Users\<user>\Documents\IISExpress
Я столкнулся с этой проблемой в веб-приложении, размещенном на общем сервере хостинга. Таким образом, очевидно, что у меня не было прямого доступа к IIS, поэтому не могло применяться множество предложенных здесь решений.
На панели управления хостинг-провайдера я включил ведение журнала ошибок для IIS и ASP.Net. А потом узнал, что ошибка на самом деле лежала в отсутствующем cshtml.
Я также столкнулся с этой проблемой. Приложение MVC4 работает на Windows Server 2012 R2 с IIS 8.5. Ни один из этих опубликованных решений не работал у меня... установка отсутствующих фреймворков через IIS-функции могла решить его, но установка всегда была неудачной.
Мне пришлось использовать Web Platform Installer
и установить следующие пакеты:
Это, возможно, не полезное решение для 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, маршрутизация на пейджинг управляется модулями!!!
Для меня удаление WebDAV с моего сервера заставило приложение вернуть сообщение 503 Service Unavailable
Error при использовании PUT
или DELETE
, поэтому я снова установил его обратно. Я также попытался полностью удалить .NET Framework 4.5 и переустановить его, а также попытался перерегистрировать, как было предложено, но безрезультатно.
Я смог исправить это, отключив WebDAV для отдельного пула приложений, это остановило ошибку "плохого модуля" при использовании PUT
или DELETE
.
WebDAV Authoring Tools
в спискеDisable WebDAV
в верхнем правом углу.Ta daaaa!
Я все еще оставил элементы удаления в файле web.config
.
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
<system.webServer>
Эта ссылка содержит инструкции, но это не очень понятно.
Вы можете исправить это, изменив тип "ExtensionlessUrlHandler-Integrated-4.0" в iis на System.Web.DefaultHttpHandler