Веб-API Asp.NET - 405 - HTTP-глагол, используемый для доступа к этой странице, недопустим - как установить сопоставления обработчика - PullRequest
91 голосов
/ 24 марта 2012

Я написал REST-сервис, используя ASP.NET Web API. Я пытаюсь отправить запрос HttpDelete, но получаю следующую ошибку:

405 - HTTP-глагол, используемый для доступа к этой странице, запрещен

Я думаю, что я близок к решению, я обнаружил, что мне нужно включить удаленное управление IIS, перейти в раздел «Сопоставления обработчиков» и добавить глагол «DELETE» в соответствующую позицию ... но проблема в том, что в списке много разных позиций ... (как здесь: http://www.somacon.com/p126.php).

Какой из них я должен редактировать? Немногие из них не имеют расширения, например «ExtensionUrlHandler-Integrated-4.0», и я добавил к нему глагол DELETE, но он все равно не работает ...

Это был просто выстрел в темноте, чтобы изменить этот, так что я должен изменить другое положение? Если да, то какой? Или, может быть, есть что-то еще, что я должен сделать?

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

Привет

Ответы [ 13 ]

316 голосов
/ 22 января 2013

Вам не нужно удалять WebDAV, просто добавьте эти строки в web.config:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
25 голосов
/ 24 марта 2012

Распространенной причиной этой ошибки является WebDAV . Убедитесь, что вы удалили его.

16 голосов
/ 05 марта 2014

Измените файл Web.Config, как показано ниже

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
14 голосов
/ 01 ноября 2013

Измените файл Web.Config, как показано ниже. Это будет действовать как очарование.

В узле <system.webServer> добавить ниже часть кода

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

После добавления ваш Web.Config будет выглядеть ниже

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <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" />
    </handlers>
</system.webServer>
4 голосов
/ 27 августа 2014

Если ни одно из вышеперечисленных решений не решило вашу проблему, как в моем случае (все еще застрял с моим модулем RestClient на 405), попробуйте запросить ваш Api с помощью инструмента, такого как Postman или Fiddler.Я имею в виду, что проблема может быть в другом месте, как плохо отформатированный запрос.

Я обнаружил, что мой модуль RestClient запрашивал «Put» с пареметром Id, неправильно отформатированным:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

вместо

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

К сожалению, плохо отформатированзапрос возвращает 405 - метод не разрешен (IIS 7.5)

3 голосов
/ 13 марта 2019

У меня была эта проблема, и я решил следующее:

  1. открыть IIS
  2. Выберите серверный сайт

    enter image description here

  3. в представлении функций: открыть отображение обработчика

enter image description here

  1. в окне сопоставления обработчиков, Find WebDAV

enter image description here

  1. в редактировании сопоставления модулей, открыть ограничения запросов

enter image description here

  1. enter image description here
3 голосов
/ 19 апреля 2013

Необычно, но может помочь некоторым.

убедитесь, что вы используете [HttpPut] из System.Web.Http

Мы получили «Метод не разрешен» 405 для декорированного метода HttpPut.

Наша проблема может показаться необычной, поскольку мы случайно использовали атрибут [HttpPut] изSystem.Web.Mvc, а не System.Web.Http

Причина в том, что resharper предложил версию .Mvc, где, как обычно, на System.Web.Http уже ссылаются, когда вы производите непосредственно от ApiController мы использовали класс, который расширил ApiController.

2 голосов
/ 08 февраля 2017

Эта ошибка исходит от обработчика staticfile - который по умолчанию не фильтрует глаголы, но, вероятно, может работать только с HEAD и GET.

И это потому, что ни один другой обработчик не подошел ксказал, что они могут обрабатывать DELETE.

Поскольку вы используете WEBAPI, который из-за маршрутизации не имеет файлов и, следовательно, расширений, в ваш файл web.config необходимо добавить следующие дополнения:

<system.webserver>
    <httpProtocol>
        <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="C:\windows\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="C:\windows\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" />

Очевидно, что необходимо зависит от классического режима по сравнению с интегрированным режимом, а классический режим зависит от битности.Кроме того, заголовок OPTIONS был добавлен для обработки CORS, но если вы не делаете CORS, вам это не нужно.

FYI, ваш web.config является локальным для приложения (или каталога приложения)) версия, верхний уровень которой - applicationHost.config.

2 голосов
/ 13 октября 2015

У меня было такое (метод 405 не разрешен), когда вызываемый мной метод web api post имел примитивные типы для параметров, а не сложный тип, к которому обращались из тела. Вот так:

Это сработало:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

Это не так:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)
1 голос
/ 19 июля 2017

Если это IIS 8.0, проверьте, включена ли активация HTTP. Диспетчер серверов -> IIS -> Управление (см. Справа вверху) -> Добавить роли и компоненты -> ... -> перейти к конфигурации WCF и затем выбрать активацию HTTP.

...