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

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

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

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

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

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

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

Привет

Ответ 1

Общей причиной этой ошибки является WebDAV. Обязательно удалите его.

Ответ 2

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

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

Ответ 3

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

В node <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

Измените файл 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>

Ответ 5

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

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

Мы получили "метод не разрешен" 405 в методе, декорированном HttpPut.

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

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

Ответ 6

Если ни одно из вышеперечисленных решений не решило вашу проблему, как в моем случае (все еще застрял с моим модулем RestClient, стоящим перед 405), попробуйте запросить у Api такой инструмент, как 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)

Ответ 7

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

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

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

Это не так:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

Ответ 8

Эта ошибка исходит от обработчика 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" />

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

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

Ответ 9

В нашем случае проблема заключалась в объединении подписей между сайтом .Net и ADFS. При перенаправлении на конечную точку ADFS для параметра wctx необходимы все три параметра для WSFederationAuthenticationModule.CreateSignInRequest: rm, id и ru

Спасибо Guillaume Raymond за подсказку, чтобы проверить параметры URL!

Ответ 10

Помимо всех вышеперечисленных решений, проверьте, есть ли у вас "id" или любой пользовательский определенный параметр в методе DELETE соответствует конфигурации маршрута.

public void Delete(int id)
{
    //some code here
}

Если вы набрали повторяющиеся 405 ошибок, лучше reset подпись метода по умолчанию, как указано выше, и попробуйте.

Конфигурация маршрута по умолчанию будет искать id в URL. Поэтому имя параметра id здесь важно, если вы не измените конфигурацию маршрута в папке App_Start.

Однако вы можете изменить тип данных id.

Например, метод ниже должен работать нормально:

public void Delete(string id)
{
    //some code here
}

Примечание. Также убедитесь, что вы передаете данные по URL не методу данных, который будет содержать полезную нагрузку в качестве содержимого тела.

DELETE http://{url}/{action}/{id}

Пример:

DELETE http://localhost/item/1

Надеюсь, что это поможет.

Ответ 11

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