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