«Метод 405 запрещен» в IIS7.5 для метода «PUT»

113

Я использую WebClienttype для загрузки файлов * .cab на свой сервер. На стороне сервера я зарегистрировал обработчик HTTP для файла * .cab с помощью метода PUT, как показано ниже:

 <add name="ResultHandler" path="*.cab" verb="PUT" type="FileUploadApplication.ResultHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />

Но я всегда получаю ошибку «405 метод не разрешен». В ответе говорится, что допустимые методы следующие:

Headers = {Allow: GET, HEAD, OPTIONS, TRACE
Content-Length: 1293
Content-Type: text/html
Date: Fri, 27 May 2011 02:08:18 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET}

Даже если я явно разрешаю метод PUT в фильтрации запросов IIS для моего веб-приложения, та же ошибка все равно возникает.

Я подозреваю, что это проблема, связанная с IIS. Я надеюсь, что кто-нибудь сможет пролить свет на это для меня.

smwikipedia
источник

Ответы:

214

Часто эта ошибка вызвана модулем WebDAV, который пытается обрабатывать такие запросы. Простое решение - удалить его из модулей и из обработчиков system.webServerраздела внутри вашего файла web.config. Вот пример конфигурации:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
Давиде Икарди
источник
2
Используя следующую статью MS, я добавил тег удаления в обработчики, но он по-прежнему не работал. Благодаря вашему ответу я вижу, что мне также нужно было добавить его в раздел модулей. Очень признателен. Вот статья: asp.net/web-api/overview/testing-and-debugging/…
Тод
Отлично, вы сэкономили мне часы мучительной отладки! :)
Kaspars Ozols
Простое и легкое исправление, спасибо!
MorenajeRD
Я пробовал это, но у меня не работает. Я все еще получаю сообщение об ошибке 405 - Метод запрещен. Обратите внимание, что я использую IIS Express, и ошибка каким-то образом возникает только при PUT, но работает для GET, POST И DELETE.
Тьерри
47

Я включил отслеживание неудачных запросов и получил следующую информацию:

 <EventData>
  <Data Name="ContextId">{00000000-0000-0000-0F00-0080000000FA}</Data>
  <Data Name="ModuleName">WebDAVModule</Data>
  <Data Name="Notification">16</Data>
  <Data Name="HttpStatus">405</Data>
  <Data Name="HttpReason">Method Not Allowed</Data>
  <Data Name="HttpSubStatus">0</Data>
  <Data Name="ErrorCode">0</Data>
  <Data Name="ConfigExceptionInfo"></Data>
 </EventData>

Итак, я удалил WebDAVModule из своего IIS, теперь все в порядке ~

Функция трассировки IIS очень полезна.

smwikipedia
источник
1
Спасибо за Ваш ответ ! После 2 дней исследований единственным рабочим решением, которое я нашел, чтобы избежать «405 Method Not Allowed», было определение заголовков CORS в Application_BeginRequestметоде, как указано в этом ответе stackoverflow.com/a/14631068/827168 . Но ваш ответ лучше, чем все остальные, потому что он помогает обнаружить проблему вместо применения какого-то случайного патча :)
pomeh
@pomeh Я всегда верю в полную логику. :)
smwikipedia 09
1
@Demodave Проверьте здесь: technet.microsoft.com/en-us/library/cc731223%28v=ws.10%29.aspx
smwikipedia
1
Обратите внимание: вам также следует зайти в Сопоставления обработчиков и удалить оттуда WebDAV, иначе вы получите сообщение об ошибке Handler "WebDAV" has a bad module "WebDAVModule" in its module list.
pipedreambomb
26

У меня была эта проблема с WebDAV при размещении проекта MVC4 WebApi. Я обошел это, добавив эту строку в web.config:

<handlers>
  <remove name="WebDAV" />
  <add name="WebDAV" path="*" verb="*" modules="WebDAVModule"
      resourceType="Unspecified" requireAccess="None" />
</handlers>

Как объясняется здесь: http://evolutionarydeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html

Ник
источник
Лучшее решение для тех, кому действительно нужен WebDAV. Нужен ли кому-нибудь WebDAV - отдельный разговор.
MrBoJangles
24

Взято отсюда, и это сработало для меня:

1. Перейдите в диспетчер IIS.

2. Щелкните свое приложение.

3. Перейдите в «Сопоставления обработчиков».

4. В списке функций дважды щелкните «WebDAV».

5.Щелкните «Запросить ограничения».

6. Во вкладке «Глаголы» выберите «Все глаголы».

7. Нажмите ОК.

Goran85
источник
3
Мне это помогло, но я поясню на своем опыте. 2. Приложение (Веб-служба). 3. дважды щелкните значок «Сопоставления обработчиков» на центральной панели.
Гэри
19

Я попробовал большинство ответов, и, к сожалению, ни один из них не сработал полностью.

Вот что у меня сработало. Есть 3 вещи, которые нужно сделать с сайтом, для которого вы хотите PUT (выберите сайт):

  1. Откройте, WebDav Authoring Rulesа затем выберите Disable WebDAVопцию, присутствующую на правой панели.

  2. Выберите Modules, найдите WebDAV Moduleи удалите.

  3. Выберите HandlerMapping, найдите WebDAVHandlerи удалите.

Перезагрузите IIS.

coding_idiot
источник
Это работает! Не знаю, можно ли выполнить все 3 шага, отредактировав файл web.config, но это упростило использование только консоли управления IIS. Просто обратите внимание, что есть 3 записи HandlerMapping, начинающиеся с WebDAV * - я удалил все 3, и все прошло хорошо.
SlimsGhost 03
1
Я попытался удалить WebDav, но ничего не вышло. Затем я выполнил все три шага выше и PUTначал работать.
Redyesdev
1
Шаги 2 и 3 можно применить к виртуальному каталогу, не затрагивая остальную часть сайта.
Tonatio
1
Большое спасибо. ты спас меня. После 7 часов разочарования я перепробовал все ответы, которые мог, и, наконец, ваш ответ поразил меня. :)
Зишан Сафдар
1
Спасибо, вот и все.
Ахмад Хамди,
17

Достаточно удалить WebDAV-модуль. Просто измените свой Web.config:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />
Dunken
источник
14

Лучше всего просто удалить неиспользуемую функцию WebDAV. Перейдите в « Программы и компоненты» => Включите или отключите функции Windows и отключите публикацию WebDAV в разделе

Internet Information Services => World Wide Web Services => Общие функции HTTP

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

SliverNinja - MSFT
источник
Спасибо ! Это полностью устранило мою проблему!
wmehanna
4

По какой-то причине пометки WebDAVModule как «удалить» в моем web.config было недостаточно для решения проблемы в моем случае.

Я нашел другой подход , который сделал решить эту проблему. Если вы находитесь в одной лодке, попробуйте следующее:

  1. В диспетчере IIS выберите приложение, которое должно поддерживать PUT.
  2. В представлении функций найдите Правила создания WebDAV . Дважды щелкните его или выберите « Открыть компонент» в контекстном меню (щелкните правой кнопкой мыши).
  3. На панели Действия, найдите и нажмите на WebDAV Settings ... .
  4. В настройках WebDAV найдите Request Filtering Behavior , а под ним найдите Allow Verb Filtering . Установите для параметра Allow Verb Filtering значение False .
  5. На панели Действия щелкните Применить .

Это предотвращает отклонение WebDAV глаголов, которые он не поддерживает, тем самым позволяя PUT беспрепятственно проходить через обработчик RESTful.

Дэн К
источник
4

Еще один совет от меня. Я использовал PHP + IIS, и сопоставления обработчиков для PHP не содержали глагола PUT.

Перейдите в Менеджер IIS-> Ваш сайт-> Сопоставления обработчиков-> PHPxx_via_FastCGI-> Ограничения запросов-> Глаголы, затем добавьте PUT.

Это оно!

Стефан Пинтили
источник
1
Это тот ответ, который нужен пользователям php.
SpeedOfRound
4

Еще один важный модуль, который необходимо перенастроить перед тем, как PUT и DELETE заработают, - это команда параметров.

<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="WebDAV" />
<add name="OPTIONSVerbHandler" path="*" verb="*" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="Script" />
</handlers>

Также см. Этот пост: https://stackoverflow.com/a/22018750/9376681

Майкл Радхубер
источник
4

Я использовал Angular 8 и был .NET core API. Я добавляю следующее в свой служебный файл web.config. Это разрешит мою ошибку.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>
Атик Саркер
источник
3

У меня были те же проблемы с PUT, PATCH и DELETE, но с установленным WebDav ничего не было. Наконец, мне помогло решение 1 в этой статье: http://support.microsoft.com/kb/942051

gust1n
источник
2

Для меня эта ошибка не исчезнет и не разрешит методы PUT, что бы я ни делал ... удалил webdav, поместил конфигурацию в web.config, чтобы удалить webdav из обработчиков и модулей, и настроил PUT как разрешенный глагол в фильтрах запросов на iis .. и убедитесь, что для сопоставлений обработчиков iis, обрабатывающих запрос, настроен PUT.

Моя проблема в конечном итоге возникла из-за неправильной установки расширений ASP.NET 4.5. Удалено все, что связано с asp.net из ролей и функций сервера. перезапущен. перечитал роли и перезапустил. все работало с вышеуказанной конфигурацией.

--- Приведенное ниже приведет к тому, что PUT будет принят, но отправит его не тому обработчику. - игнорировать нижеприведенное

наконец, добавление команды PUT в качестве разрешенной команды в сопоставлении обработчика TRACE на iis сработало ... так как я включил трассировку неудачных ошибок, и эта команда не позволяла использовать команду.

в прошлый раз, когда у меня была такая же проблема на IIS другого сервера, это было из-за отсутствия '/' в конце URL-адреса, поскольку он использовал обработчик по умолчанию, вероятно, без использования документа по умолчанию, и теперь я это понимаю ... поэтому проверьте IIS сопоставления обработчиков, если ничего не помогает.

Хариш
источник
2

У меня была эта проблема, но проблема не связана с WebDAV. В моем случае клиент отправлял POST на www.myServer.com/api/chart. Этот вызов должен обрабатываться "ExtensionlessUrlHanlder-Integrated-4.0", однако каким-то образом в моем каталоге сервера "... \ Server \ api \ chart \" была создана локальная файловая структура. Это означало, что вместо этого был вызван обработчик "StaticFile". Наконец, удаление этих локальных файлов решило проблему.

Атилио Джобсон
источник
2

Вот что у меня сработало:

Откройте IIS и щелкните свой сайт.

1 - Double Click on the Modules 2 - Right Click on WebDavPublishing and remove. 3 - Restart running WebSite.

nPcomp
источник
1

Для Windows server 2012 -> Перейдите в Диспетчер серверов -> Удалить роли и компоненты -> Роли сервера -> Веб-сервер (IIS) -> Веб-сервер -> Общие функции HTTP -> Снимите флажок «Публикация WebDAV» и удалите его -> Перезагрузите сервер.

Саван Гадхия
источник
0

Если пул приложений IIS работает в классическом режиме, убедитесь, что в вашем web.config есть следующее:

<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" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
Арджун Мукхерджи
источник
0

В моем случае я переместил веб-развертывание на другой порт, который также был портом IIS (не 80). Сначала я не осознавал, но, хотя и не было ошибок, запущенных на одном и том же порте, похоже, что Web Deploy по какой-то причине скорее всего отвечал первым, а не IIS, вызывая эту ошибку. Я просто переместил привязку IIS к другому порту, и все в порядке. ;)

Джеймс Уилкинс
источник
0

Чтобы вообще предотвратить включение WebDav, удалите следующую запись из ApplicationHost.config: <add name="WebDAVModule" />

Запись находится в разделе модулей.

Точное расположение конфига: C:\Windows\System32\inetsrv\config\applicationHost.config

Yush0
источник
0

У меня была такая же проблема с RESTful API, работающим на ядре aspnet.

Я не хотел удалять WebDAV и попробовал большинство описанных выше средств. Я пытался установить глаголы = "*" как на сайте, так и на самом сервере, но безуспешно.

Уловка для меня заключалась в следующем:

Диспетчер IIS -> Сайты -> Мой сайт -> HandlerMappings -> aspNetCore -> Изменить

-> Ограничения запроса -> Доступ -> Нет (это был скрипт).

После этого все заработало, даже если я заменил исходные параметры WebDAV.

Дардан Вокши
источник