Asp.NET Web API - 405 - Дієслово HTTP, що використовується для доступу до цієї сторінки, заборонено - як встановити відображення обробника


106

Я написав послугу REST за допомогою веб-API ASP.NET. Я намагаюся надіслати запит HttpDelete, однак я отримую таку помилку:

405 - Дієслово HTTP, яке використовується для доступу до цієї сторінки, заборонено

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

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

Це був лише постріл у темряві, щоб змінити це, тож чи варто змінювати інше положення? Якщо так, то який? А може, є щось більше, що я повинен робити?

Цей же веб-сервіс відмінно працює на моїй локальній службі, тому я думаю, що проблема полягає у віддаленому IIS ...

Привітання


3
Гей, Барт. Чи можете ви змінити відповідь на сторінку web.config? Це дійсно краще, ніж видалити його. і у вас багато глядачів
Ашкан Сірос

Відповіді:


28

Поширена причина цієї помилки - WebDAV . Переконайтесь, що ви його видалили.


Я відключив це, але це не допомогло
Барт

3
Відключення не допомагає, вам потрібно його видалити.
Джон_

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

7
Відповідь giacomelli нижче повинна бути позначена правильною для цього питання; це локальне рішення, яке не вимагає видалення WebDav.
Джозеф Вудвард

1
@ B.ClayShannon WebDAV не є окремою програмою, це функція IIS. Отже, залежно від вашої ОС, ви повинні знайти її під функціями Windows / ролями / службами ролей / ... все, що їм інше придумати для класифікації. Але якщо зміна web.config не змінилася, це означає, що ви все одно стикаєтеся з іншою проблемою.
Фредерік

359

Вам не потрібно видаляти WebDAV, просто додайте ці рядки до web.config:

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

1
Це добре спрацювало. Потрібно використовувати все це; включити обидва рядки "видалити ім'я = ..."
Кріс Паттерсон

51
Це має бути прийнятою відповіддю, оскільки це місцеве рішення, а не глобальне.
Marco Mp

3
це щойно придумало для мене перед величезною демонстрацією завтра вранці. ти буквально врятував мені життя.
Sonic Soul

27
"Ви буквально врятували мені життя" - Раптом мої клієнти не здаються такими поганими.
Брендон Гано

3
Відмінна відповідь. Я згоден, що це має бути прийнятою відповіддю. Це змусило мене відчувати себе набагато краще, ніж повністю видалити WebDAV з нашого веб-сервера.
mituw16

17

Змініть файл 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>

Додавання видалення WebDAV та WebDAVMODULE дозволило функція PUT і DELETE. Дякую.
Gfw

Це в пекло, коли я додаю вище код у свій файл веб
конфігурації

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 дієслів.
Santosh Prasad Sah

3
Я не заявив, а лише побічний коментар, якщо хтось із копій вставив рішення.
Карлас

Дякую! runAllManagedModulesForAllRequests = "true" - це те, що було для мене.
Едді Флетчер

9

У мене була ця проблема, і я вирішив наступне:

  1. відкритий IIS
  2. Виберіть сайт Backend

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

  3. у перегляді функцій: відкрити картографічну обробку

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

  1. у вікні Карту обробника знайдіть WebDAV

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

  1. у Редагуванні картографії модуля відкрийте Запит обмежень

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

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

Врятувало мені життя. Дякую
deanwilliammills

1
Це не вийшло. Він зламав весь сайт .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) як клієнт інструменту, і він працює дуже добре. Але не на мій код. Якісь ідеї?
Дарос

3

Нечасто, але може допомогти деяким.

переконайтеся, що ви використовуєте [HttpPut] від System.Web.Http

Ми отримували "метод не дозволений" 405 методом декорованого HttpPut.

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

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


1
Якщо ви використовуєте Web API, ви взагалі не прикрашаєте методи контролера, а використовуєте дієслово у назві методу.
niico

2

У мене це траплялося (метод 405 не дозволений), коли метод веб-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
Це також може статися, якщо між параметром у маршруті та назвою змінної в підписі методу є невідповідність (Іншими словами route = "/ api / person / {identitet}" та метод = "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" />

Очевидно, що потрібно залежить від classicmode vs integmode, а classicmode залежить від розрядності. Крім того, для обробки CORS додано заголовок OPTIONS, але якщо ви не робите CORS, цього вам не потрібно.

FYI, ваш 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- host -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.