IIS 7.5 + включить PUT и DELETE для службы RESTFul, без расширения
Я пытаюсь понять, как IIS 7.5 обрабатывает запрос POST и PUT.
Я пишу службу RESTful с использованием инфраструктуры OpenRasta. Работа POST работает без каких-либо проблем, но операция PUT для одного и того же URL-адреса не работает. Он возвращает ошибку, как показано ниже.
Detailed Error Information
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002
URL-адрес выглядит следующим образом: "http://localhost/MyService/Resource.Something.manifest"
Такая же настройка отлично работает в Visual Studio IIS.
Решение
В основном по умолчанию ExtensionlessUrlHandler не принимает команды PUT и DELETE. Просто добавьте их.
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
Ответы
Ответ 1
Чтобы PUT и DELETE были приняты IIS 7.5 для REST API с быстрым CGI-протоколом PHP 5.4, мне пришлось отключить модуль WebDAV. В противном случае модуль WebDAV вмешивается в HTTP-запросы, используя PUT или DELETE. Чтобы получить эту работу, было немного запутанно, и я мог пропустить некоторые шаги или сделать это в другом порядке.
Эти строки помещаются как дочерние элементы <system.webServer>
-элемента в web.config в корне приложения.
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
Надеюсь, это может сэкономить некоторое разочарование. Кажется, что по умолчанию для сервера требуется принять любой HTTP-глагол, который не указан - см. настройки под Request filtering -> HTTP Verbs -> Edit feature Settings
. Можно рассмотреть возможность явного добавления VERBS, которые должны быть разрешены. Можно указать допустимые глаголы, добавляя этот фрагмент, также как дочерний элемент <system.webServer>
.
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
На клиентской машине можно удалить модуль WebDAV отсюда:
Control Panel -> Uninstall Program -> Turn Windows features on or off -> IIS -> World Wide Web Services -> Common HTTP feautre -> WebDAV Publishing
Последняя мера для ее работы - редактирование applicationhost.config
, найденное в C:\Windows\System32\inetsrv\config
. Здесь я добавил нужные мне глаголы:
<add name="PHP54_via_FastCGI" path="*.php"
verb="GET,HEAD,PUT,DELETE,POST"
modules="FastCgiModule"
scriptProcessor="C:\Program Files (x86)\PHP\v5.4\php-cgi.exe"
resourceType="Either" />
Ответ 2
1.Перейти к диспетчеру IIS.
2. Нажмите на свое приложение.
3. Переходите к "сопоставлениям обработчиков".
4. В списке функций дважды щелкните "WebDAV".
5. Нажмите "Запросить ограничения".
6. На вкладке "Глаголы" выберите "Все глаголы".
7. Нажмите OK.
Ответ 3
См. http://learn.iis.net/page.aspx/901/iis-express-faq/, который связан с викирой OR.
Из ссылки (не для кавычек для чтения):
A: Вы можете изменить IIS Express applicationHost.config
в папке %userprofile%\documents\IISExpress\config
. Например, чтобы включить PUT и DELETE для неограниченных адресов, прокрутите вниз до нижней части файла IIS Express applicationHost.config
и найдите запись обработчика, которая начинается с:
<add name="ExtensionlessUrl-Integrated-4.0"
& hellip;
В атрибуте verb
добавьте PUT
и DELETE
, поэтому атрибут verb
выглядит следующим образом: verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
.
Ответ 4
Для меня это делает трюк в файле web.config.
<system.webserver>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<system.webserver/>
<system.web>
<authentication mode="Windows" />
<identity impersonate="true"/>
<system.web/>
Я использовал следующую конфигурацию:
- IIS 7.5
- Windows Server 2008 R2
- Пользовательский пул приложений,.NET 4.0, Интегрированный
- Аутентификация Windows = true
- Анонимная аутентификация = false
Надеюсь, это поможет.; -)
Ответ 5
Мой сценарий был веб-приложением на веб-сайте IIS 7.5. Веб-сайт должен был продолжать включать WebDAV, но веб-приложение должно было отключить его, чтобы поддерживать PUT и DELETE в его REST API.
Чтобы получить эту работу, веб-приложение Web.config понадобилось:
<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" >
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
Важным отличием от других ответов здесь является необходимость runManagedModulesForWebDavRequests = "true"
Ответ 6
Пользователи инструмента URLScan
Если другие ответы по-прежнему не работают, и вы получаете 404 ошибку: эти глаголы могут быть явно отклонены инструментом URLScan, если вы его установили.
Вы можете настроить разделы [AllowVerbs]
и [DenyVerbs]
файла URLScan.ini
в соответствии с вашими потребностями.
Остерегайтесь рисков безопасности для включения этих глаголов.
Ответ 7
Что сработало для меня, так это удаление WebDav полностью.
Ответ 8
Переход в сопоставления обработчиков и настройка WebDAV для обработки всех глаголов - единственное, что сработало для меня, несмотря на то, что PUT
и DELETE
уже были указаны как обработанные глаголы. Рабочий web.config у меня есть:
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<remove name="WebDAV" />
<add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
</handlers>
</system.webServer>
Ответ 9
в файле web.config
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
вы также можете использовать интерфейс управления IIS и определить этот глобальный или стандартный веб-сервер
Ответ 10
Я попробовал в IIS 8.
-
** удалить WebDav Publishing
Шаги по удалению
- > Панель управления → Перейти к программам и функциям → Повернуть окна
вкл. или выкл. → Выбрать Интернет-службы → World Wide
Веб-службы- > Общие HTTP-проекты → "Удалить" публикацию WebDAV, сняв флажок "Параметр WebDAV" **
Ответ 11
Мой web.config с asp.net core 1.0
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>
Ответ 12
Я использую сервер Windows 2012. Я пробовал все, кроме этого, только работает. благодаря @John P
Откройте приложение applicationhost.config в C:\Windows\System32\inetsrv\config
Добавьте PUT, DELETE, как показано ниже.
<add name="PHP54_via_FastCGI" path="*.php"
verb="GET,HEAD,POST,PUT,DELETE"
Ответ 13
Причина ошибки 500!
Привет всем,
Я тоже хочу опубликовать свои собственные исследования, надеюсь, это поможет будущим энтузиастам. Как было предложено в ответах, я не могу удалить WebDav, поэтому добавил строку ниже в веб-конфигурацию (из других ответов)
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
но я получил ошибку 500, когда я включил режим отладки, нашел это
Cannot add duplicate collection entry of type 'add' with unique key attribute 'name' set to 'ExtensionlessUrlHandler-Integrated-4.0'
Ответ
Это потому, что в разделе сопоставления обработчиков уже был ExtensionlessUrlHandler, для устранения проблемы выполните следующие действия.
Метод 1
1) Откройте Диспетчер IIS и выберите свое приложение
2) Перейдите к функциям сопоставления обработчиков
3) Найдите ExtensionlessUrlHandler-Integrated-4.0 и удалите его.
4) Добавьте ExtensionlessUrlHandler в свой webconfig (как упоминалось выше)
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
Метод 2
1) Удалите обработчик ExtensionlessUrl из вашей веб-конфигурации.
2) Нажмите на свое приложение на сервере IIS, перейдите в HandlerMappings
3) Найти ExtensionlessUrlHandler-Integrated-4.0 (только это имя, игнорировать другие)
4) щелкните правой кнопкой мыши по нему и выберите "Редактировать"
редактировать обработчик
5) нажмите "Запросить ограничения" и выберите вкладку "Глаголы" и выберите "Все глаголы"
это позволит обработчику extensionsless разрешить все глаголы.
Я пойду с методом 1, так как мы можем иметь управление в web.config. Но убедитесь, что вы
проверьте сервер развертывания для определения дубликатов обработчиков.