«Метод 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. Я надеюсь, что кто-нибудь сможет пролить свет на это для меня.

Ответы:


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 очень полезна.


1
Спасибо за Ваш ответ ! После 2 дней исследований единственным рабочим решением, которое я нашел, чтобы избежать «405 Method Not Allowed», было определение заголовков CORS в Application_BeginRequestметоде, как указано в этом ответе stackoverflow.com/a/14631068/827168 . Но ваш ответ лучше, чем все остальные, потому что он помогает обнаружить проблему вместо применения какого-то случайного патча :)
pomeh

@pomeh Я всегда верю в полную логику. :)
smwikipedia 09


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. Нажмите ОК.


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

19

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

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

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

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

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

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


Это работает! Не знаю, можно ли выполнить все 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" />

14

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

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

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


Спасибо ! Это полностью устранило мою проблему!
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>


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.


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


0

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.