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


106

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

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

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

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

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

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

Приветствую


3
Привет, Барт. Можете ли вы изменить ответ на web.config? Это действительно лучше, чем его удаление. и у вас много зрителей
Ашкан Сироус

Ответы:


28

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


Я отключил его, но это не помогло
Барт

3
Отключение не помогает, нужно деинсталлировать.
John_

Могу подтвердить, что отключение не помогает. @John_ правильно, вам нужно удалить.
Майк Л.

7
Ответ Джакомелли ниже должен быть отмечен как правильный для этого вопроса; это локальное решение, которое не требует удаления WebDav.
Джозеф Вудворд

1
@ B.ClayShannon WebDAV - это не отдельная программа, это функция IIS. Итак, в зависимости от вашей ОС, вы должны найти его в Windows features / Roles / Roles Services / ... все, что они сочтут целесообразным изобрести для его классификации. Но если изменение в web.config не повлияло на разницу, это означает, что вы все равно столкнулись с другой проблемой.
Frédéric

359

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

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

1
Это сработало. Все это нужно использовать; включить обе строки "remove name = ...".
Крис Паттерсон

51
Это должен быть принятый ответ imho, так как это локальное решение, а не глобальное.
Marco Mp

3
это только что пришло мне в голову перед огромной демонстрацией завтра утром. ты грамотно спас мне жизнь.
Sonic Soul

27
«Ты буквально спас мне жизнь» - вдруг мои клиенты не так уж и плохи.
Brandon Gano

3
Отличный ответ. Я согласен, что это должен быть принятый ответ. Это заставило меня почувствовать себя намного лучше, чем полностью удалить WebDAV с нашего веб-сервера.
mituw16 03

18

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

1
Добавление удаления WebDAV и WebDAVMODULE позволило использовать функции PUT и DELETE. Спасибо.
Gfw

Было ужасно, когда я добавляю приведенный выше код в свой файл
webconfig

15

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

Вы не должны возвращать * для Allow-Origin. См stackoverflow.com/a/12014554
Karlas

@Karlas, пожалуйста, прочтите вопрос, прежде чем размещать свой комментарий и голосовать против. Вопрос не задавался для "Allow-Origin", а был задан для обработчика http-глаголов.
Сантош Прасад Сах

3
Я не голосовал против, просто побочный комментарий, на случай, если кто-то скопирует решение.
Карлас 07

Спасибо! runAllManagedModulesForAllRequests = "true" - вот что сделало это для меня.
Эдди Флетчер

8

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

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

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

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

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

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

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

  1. в Edit Module Mapping откройте Request Restrictions

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

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

Спас мою жизнь. Спасибо
deanwilliammills

2
Это не сработало. Он сломал весь сайт .Net CORE. Пришлось вернуться.
Рави Рам

4

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


У меня здесь такая же ситуация. Но в моем случае я должен передать тело с моим запросом PUT. Я использую Insomnia (например, Postman) как инструментальный клиент, и он работает очень хорошо. Но не в моем коде. Любые идеи?
Darós

3

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

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

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

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

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


1
Если вы используете веб-API, вы вообще не украшаете методы контроллера, а используете глагол в имени метода.
niico

2

У меня такое случалось (метод 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)

1
Это также может произойти, если существует несоответствие между параметром в маршруте и именем переменной в сигнатуре метода (другими словами route = "/ api / person / {identity}" и method = "public void putPerson (int id) {...} ")
RonnBlack

2

Эта ошибка возникает из-за обработчика статических файлов, который по умолчанию не фильтрует никакие команды, но, вероятно, может иметь дело только с 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, вам это не нужно.

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


1

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


0

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

Спасибо Гийому Раймонду за совет по проверке параметров URL!


0

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

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

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

Конфигурация маршрута по умолчанию будет искать 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

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


0

Я добавлю для тех, кто застрял при попытке запустить PHP( Laravelв некоторых случаях) или другую уникальную IISситуацию с хостингом 405 error, когда вам нужно изменить verbsобработчик в обработчике для этой конкретной ситуации ... поэтому, поскольку я использовал, PHPя пошел в PHPобработчик и в Request Restrictions, затем Verbsвкладку, добавьте verbsвам нужно. Это все, что мне нужно было добавить, web.configчтобы включить CORSв Laravel.

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

0

Ничего из вышеперечисленного у меня не сработало, и у меня возникли проблемы с использованием страницы поддержки ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -that-is-hosted-on-a-server), затем я сравнил файл хоста приложения с одной из рабочих копий и, похоже, мне не хватало нескольких обработчиков, и когда я добавил их обратно в хост приложения, он начал работать. Мне все это не хватало,

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.