Веб-API ASP.NET - команды PUT & DELETE запрещены - IIS 8

Недавно я обновился с Visual Studio 2010 до Visual Studio 2012 RC. Установщик также устанавливает IIS 8 Express, который Visual Studio теперь использует в качестве веб-сервера по умолчанию.

IIS 8 блокирует мои запросы WEB API, в которых используются команды PUT И DELETE. IIS возвращает ошибку 405 The requested resource does not support http method 'PUT'.

Я знаю, что у людей были проблемы с этим в прошлом, и есть несколько сообщений об этом в Stack Overflow. В IIS 7 Express решением было удалить WebDav. К сожалению, я не вижу способа сделать это с помощью IIS 8.

Я пробовал отредактировать разделы WebDav из applicationhost.config, но это не помогло. Например, я удалил <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> из файла конфигурации.

Я потратил на это слишком много времени. Должен быть простой способ включить PUT и DELETE?


person Mark    schedule 05.06.2012    source источник
comment
Это все еще не работает в RTM-версии. Просто потратил на это 3 часа ... Все, что нужно было, это добавить лишние глаголы к ExtensionlessUrl-Integrated-4.0.   -  person leppie    schedule 13.11.2012
comment
Я не думаю, что это сломано, но это сделано намеренно. Я думаю, что изменение поведения по умолчанию может помешать работе WebDAV и нарушить обратную совместимость. Это также не работало с IIS7, когда был установлен WebDAV.   -  person Mark    schedule 17.11.2012
comment
Я также потратил 3 часа на это ... через 6 лет после этого поста.   -  person Brian Jenkins    schedule 20.01.2019
comment
пожалуйста, посмотрите stackoverflow.com/a/55134621/4746570   -  person BehrouzMoslem    schedule 13.03.2019


Ответы (19)


Хорошо. Я наконец разобрался с этим. Вам нужно перепрыгнуть через несколько обручей, чтобы глаголы PUT и DELETE работали правильно с IIS8. Фактически, если вы установите релиз-кандидат VS 2012 и создадите новый проект WEB API, вы обнаружите, что образцы методов PUT и DELETE сразу возвращают 404 ошибки.

Чтобы использовать команды PUT и DELETE с веб-API, вам необходимо отредактировать% userprofile% \ documents \ iisexpress \ config \ applicationhost.config и добавить команды в обработчик ExtensionlessUrl следующим образом:

Измените эту строку:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

to:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

В дополнение к вышесказанному вы должны убедиться, что WebDAV не мешает вашим запросам. Это можно сделать, закомментировав следующие строки из applicationhost.config.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

Также имейте в виду, что соглашение веб-API по умолчанию заключается в том, что имя вашего метода должно совпадать с вызванной командой HTTP. Например, если вы отправляете HTTP-запрос на удаление, ваш метод по умолчанию должен называться Delete.

person Mark    schedule 06.06.2012
comment
Для подобных проблем с командой OPTIONS в IIS8 (где что-то еще перехватывает перед вашими обработчиками) попробуйте ‹remove name = OPTIONSVerbHandler /› в вашем web.config. В этом отношении я бы посоветовал использовать технику удаления в вашем локальном web.config вместо того, чтобы возиться с applicationhost.config, когда это возможно, как общее правило - person Jason; 28.03.2013
comment
Вместо удаления WebDAV на уровне сервера, который может иметь побочные эффекты, лучше удалить его из вашего проекта, как показано здесь: stackoverflow.com / a / 14465655/428280 - person Twisted; 05.07.2013
comment
И что потом? Может даже локально будет работать, а в Azure работать не будет. - person Toolkit; 13.08.2014
comment
Ответ, который предписывает изменить настройки системы, даже на машинах разработчиков, не может быть ответом. Это решает проблему и не очень помогает командам и производственной среде. Будете ли вы воспроизводить это на каждой машине? Ознакомьтесь с ответом Сантоша Сах. - person André Werlang; 04.05.2015
comment
Кроме того, мне также нужно было удалить WebDAVModule из раздела модулей согласно Ответ Сантоша Саха. - person Ivaylo Slavov; 16.05.2015
comment
К сожалению, у меня это не сработало. Я использую IIS8.5, пожалуйста, еще какие-нибудь выводы? :( - person AnimaSola; 03.09.2015
comment
При использовании IISExpress 10 с сообществом VS 2015 настройки WebDAV уже были закомментированы, но мне пришлось внести изменения в глагол ExtensionlessUrl-Integrated-4.0. Я был в тупике несколько часов до этого поста, я думал, что делаю PUT неправильно. Как я смеялся, когда узнал, что это была Microsoft ... - person Steve Hibbert; 03.01.2016
comment
Я только что наткнулся на этот ответ после целого дня поиска (10 часов). Это довольно элегантно - создать собственный обработчик, наследующий от существующего обработчика SimpleHandlerFactory. stackoverflow.com/a/37197698/165898 Наслаждайтесь! - person Jason; 03.12.2016
comment
Нет ли способа внести это изменение локально, чтобы оно применялось только к одной папке? Люди могут захотеть разрешить команды PUT на url.com/api/, но не на остальной части сайта. - person Typel; 11.10.2017
comment
Почему редактирование конфигурации IIS Express КАК-ЛИБО повлияет на IIS? - Это два разных продукта. К сожалению, это будет работать только в вашем локальном dev. среда; web.config решение ниже - это то, что вам нужно для IIS. - person BrainSlugs83; 15.10.2018
comment
Это сработало для меня, хотя я использую IIS, а не IIS Express, поэтому путь к файлу конфигурации для меня был: C: \ Windows \ System32 \ inetsrv \ Config \ applicationHost.config - person Rich; 08.02.2019

Измените файл 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>
person Santosh Prasad Sah    schedule 01.11.2013
comment
Удаление WebDavModule - правильный способ решения этой проблемы. - person MissRaphie; 19.09.2014
comment
Спас мой день: ‹модулей runAllManagedModulesForAllRequests = true› ‹remove name = WebDAVModule /› ‹/modules› - person Peter Stegnar; 03.02.2015
comment
Пользовательские заголовки не нужны, поскольку они связаны с CORS и, таким образом, вы создаете брешь в безопасности. Как раз часть, касающаяся WebDAVModule, актуальна. - person André Werlang; 04.05.2015
comment
Этот ответ верен с единственным исключением, что имя обработчика может отличаться в разных версиях IIS - например, в 7.5 используется "ExtensionlessUrlHandler-Integrated-4.0" (как в ответе выше), а в IIS 8.5 он переименован в "ExtensionlessUrl-Integrated-4.0" (также упоминается Mark S. Имя обработчика показано в страницу с ошибкой IIS, как только вы получите сообщение об ошибке, поэтому будет тривиально узнать, что установить.Я использую оба имени для поддержки различных сред хостинга. - person Ivaylo Slavov; 16.05.2015
comment
Это помогло мне включить методы PUT и DELETE в Plesk. Спасибо - person Yushell; 17.07.2015
comment
Это заставляет меня немного умирать каждый раз, когда я вижу это - runAllManagedModulesForAllRequests = true - как решение britishdeveloper.co.uk/2010/06/ - person Oliver; 02.09.2015
comment
Спасибо! Это все еще очень полезно в марте 2016 года! - person Targaryen; 23.03.2016
comment
ВНИМАНИЕ. Раздел настраиваемых заголовков в приведенном выше коде позволяет ЛЮБОМУ сайту вызывать ваш API из браузера, что является большой угрозой безопасности. Прочтите CORS, который, по сути, позволяет использовать эти заголовки. - person profMamba; 03.04.2017
comment
@profMamba, ответ не имеет отношения к CORS. Конечно, вы можете настроить Access-Control-Allow-Origin, чтобы разрешить использование ваших доменов. - person Santosh Prasad Sah; 03.04.2017
comment
Сработало для меня как шарм. Спасибо. - person Srichandradeep C; 12.12.2017
comment
это поможет мне поставить удаление после удаления ‹модулей runAllManagedModulesForAllRequests = true› ‹remove name = WebDAVModule /› ‹/modules› в vs2015 в win10 - person JPCS; 25.02.2018
comment
После внесения этого изменения я получаю внутреннюю ошибку 500. - person Jesse Barnum; 11.04.2018
comment
@JesseBarnum, отладьте, пожалуйста, и сообщите мне подробности ошибки. Само по себе вышеуказанное исправление не вызывает ошибки сервера с интервалом. - person Santosh Prasad Sah; 12.04.2018
comment
Это сработало для меня как шарм в VS 2017 и IIS 10 (справка - ›inetmgr говорит, что это версия 10, не уверен, что это точно. Может быть просто версия инструмента. В любом случае, это то, что встроено в Windows 10) . - person BrainSlugs83; 15.10.2018
comment
это сработало для меня, мне пришлось изменить его на хостинге, может работать только в моем web.config - person oware; 05.06.2019
comment
добавление этого параметра сделало изменение runAllManagedModulesForAllRequests, теперь оно работает - person Adel Mourad; 10.02.2020

Удаление WebDAV отлично подходит для моего случая:

<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.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>

Всегда лучше решить проблему через web.config вместо того, чтобы исправлять ее через iis или machine.config, чтобы гарантировать, что этого не произойдет, если приложение размещено на другом компьютере

person Peter.Wang    schedule 27.04.2015
comment
Это сработало для меня, тогда как другие по какой-то причине (были на IIS 8.5), спасибо - person John; 03.11.2015
comment
Удаление WebDAVModule у меня сработало, не нужно удалять обработчик WebDAV (IIS 8.0). - person PeterS; 30.03.2016
comment
просто удаление webdav работает на framework 4.6.2 iis8.5 - person Abdul Rehman Sayed; 08.03.2017

Обновите ваш web.config

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

Устраняет необходимость изменять конфигурацию вашего хоста.

person Chris Marisic    schedule 23.09.2014
comment
Мне уже писали другую строчку, но она не работала. после добавления строк ‹remove name = WebDAVModule /› и ‹remove name = WebDAV /› теперь он работает. Большое спасибо и 1 голос за. - person Banketeshvar Narayan; 08.09.2016
comment
Это работает, но может не работать из-за блокировки конфигурации, препятствующей использованию ‹modules› в web.config. В этом случае вам необходимо отключить блокировку конфигурации в applicationHost.config. Если по какой-то причине у вас нет контроля над applicationHost.config, то этот подход использовать нельзя. - person Florian Winter; 18.01.2017
comment
Работал с IIS10, хотя я просто использовал * как глагол - person Javier G.; 04.01.2018
comment
Работал с IIS 10 и Web API 2. Работал, должен добавить, после того, как еще десяток решений, которые я нашел в Интернете, не работал. Спасибо! - person Matt West; 24.05.2019

В Asp.Net Web API - webconfig. Это работает во всех браузерах.

Добавьте следующий код в тег System.web

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

Замените свой тег system.webserver приведенным ниже кодом.

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

<validation validateIntegratedModeConfiguration="false" />
<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

</handlers>

person Ganesh    schedule 27.08.2013
comment
У меня была эта проблема в IIS 7.5, и это исправление отлично сработало. Вместо того, чтобы удалять весь мой контент system.webserver, я просто объединил соответствующие настройки, указанные выше, в свои собственные настройки. - person Keith Walton; 15.10.2013
comment
ВНИМАНИЕ. Раздел настраиваемых заголовков в приведенном выше коде позволяет ЛЮБОМУ сайту вызывать ваш API из браузера, что является большой угрозой безопасности. Прочтите CORS, который, по сути, позволяет использовать эти заголовки. - person profMamba; 02.12.2013
comment
Также была эта проблема на iis 7.5, и это сработало. Обязательно прочтите сообщение Toolkit выше о риске, связанном с открытием коров для всех. Также проголосуйте за его комментарий, потому что такие лакомые кусочки очень ценны. - person sjdirect; 06.11.2014
comment
Я не думаю, что в этом случае вам вообще нужны специальные заголовки. Остальной части раздела system.webserver должно хватить - просто убедитесь, что у вас есть правильное имя для обработчика URL без расширения. - person Ivaylo Slavov; 16.05.2015
comment
@profMamba Итак, как мы должны безопасно развернуть веб-службу PUT, если мы этого не сделаем ?! - person niico; 22.03.2017
comment
@niico Вы должны разрешить Access-Control-Allow-Origin только надежным сайтам, т.е. заменить * URL-адресом вашего сайта (ов). Это свойство представляет собой белый список всех надежных сайтов, если вы не хотите доверять всему Интернету (что обычно является плохой идеей). - person profMamba; 03.04.2017
comment
Наконец, после долгого горя, это сработало для меня на убогом корпоративном компьютере. Windows 7. Visual Studio 2013. Спасибо! - person Florida G.; 22.06.2017
comment
Customheaders исправили проблему для ядра .net в IIS 10 в Windows Server 2016. Спасибо! - person atakan; 08.06.2018

это сработало для меня на iis8 вместе с некоторыми другими ответами. Моя ошибка была 404.6 конкретно

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>
person Sico    schedule 25.01.2015
comment
когда вы запускаете AppCmd, это то, что помещает в ваш web.Config (за исключением бита applyToWebDAV). - person Chase Florell; 19.02.2015

Просто быстрое обновление для всех, кто может столкнуться с этой проблемой. На сегодняшний день изменение% userprofile% \ documents \ iisexpress \ config \ applicationhost.config больше НЕ работает (до сих пор это работало нормально, не уверен, связано ли это с обновлением Windows). После нескольких часов разочарования я изменил web.config, чтобы добавить эти обработчики в system.webserver, чтобы заставить его работать:

<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>
person Hari    schedule 05.01.2016

Включить CORS (красиво и аккуратно)

1.Добавьте пакет CORS nuget

Install-Package microsoft.aspnet.webapi.cors

2. в файле WebApiConfig.cs для метода Register добавьте следующий код:

config.EnableCors();

пример:
с использованием System.Web.Http;

namespace test
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services


        config.EnableCors(); //add this**************************


        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );           
    }
}
}

3. Добавьте приведенный ниже код в пространство имен контроллера, включая get, post, delete, put или любой метод http.

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]

ex:

using System.Web.Http.Cors;//add this******************************
namespace Test.Controllers
{
[EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")]
public class RestaurantController : ApiController
{
    protected TestBusinessLayer DevTestBLL = new TestBusinessLayer();

    public List<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}

ссылка: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api.

person zokaee hamid    schedule 31.01.2016

Для PHP это было просто:

  1. Откройте IIS
  2. Перейти к сопоставлениям обработчиков
  3. нажмите "Изменить" на php5.6.x или php7.0.x
  4. нажмите "запросить ограничения"
  5. на вкладке глаголов выберите «один из следующих глаголов» и добавьте «GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS»

Думаю, это будет работать и с другими обработчиками.

person Frank Forte    schedule 23.05.2016

После того, как ничего не сработало, я смог решить эту проблему, выполнив следующие шаги:

• Не выбирал настройки IIS «WEB DAV PUBLISHING» при установке IIS. • INETMGR - Веб-сайт по умолчанию - Фильтрация запросов - HTTP-команды - PUT as True

person Anshuman Saurabh    schedule 15.06.2016

После бесконечного поиска и попытки использовать уже предоставленные ответы (добавление глаголов PUT, DELETE и удаление WEBdav) это просто не сработало.

Я зашел в настройки ведения журнала IIS:> Просмотреть файлы журнала. В моем случае W3SVC4 был папкой с последней датой, открыл папку, просмотрел последний файл журнала и увидел эту запись: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

Метод обновления был указан с глаголом GET, странно, правда? Итак, я поискал в Google поиск Rejected-By-UrlScan и нашел эту ссылку: UrlScan сломал мой блог.

Я зашел сюда:% windir% \ system32 \ inetsrv \ urlscan \ UrlScan.ini

По сути, UrlScan блокировал команды PUT и DELETE. Я открыл этот INI-файл, добавил PUT и DELETE в AllowVerbs и удалил их из списков DenyVerbs. Я сохранил файл INI, и он сработал! Поэтому для меня эти шаги были необходимы рядом с подсказками ExtensionlessUrlHandler.

Windows Webserver 2008 R2 (64-разрядная версия), IIS 7.5. Я использую это в сочетании с DotNetNuke (DNN) WebAPI. ASP.Net 4.0 Мой метод обновления:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)
person DHFW    schedule 30.04.2015

Я столкнулся с той же проблемой с вами, а затем решил ее. Вот решения, я бы хотел, чтобы это могло помочь
Во-первых

В IIS modules Configuration включите WebDAVModule, если он есть на вашем веб-сервере, затем удалите его

Второй

В конфигурации IIS handler mappings вы можете увидеть список включения обработчика, выбрать the PHP item, отредактировать его на странице редактирования, нажать кнопку ограничений запроса, затем выбрать the verbs tab в модальном окне, в поле указать глаголы для обработки метки, проверить all verbs radio, затем нажмите ОК, вы также можете увидеть предупреждение, оно показывает нам, что для выполнения PHP-CGI используются двойные кавычки, а затем сделайте это

если это сделано, перезапустите сервер IIS, все будет в порядке

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

person Chauncery    schedule 03.07.2018
comment
Я только удалил WebDAVModule с веб-сайта IIS, и это сработало для меня - person Umair Malhi; 06.10.2018

Помимо всех вышеперечисленных решений, проверьте, соответствует ли «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

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

person Arun    schedule 16.11.2015

Я не уверен, правильно ли вы отредактировали файл конфигурации. Попробуйте выполнить следующие шаги

  1. откройте% userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config

  2. По умолчанию указанные ниже записи комментируются в файле applicationhost.config. раскомментируйте эти записи.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


<add name="WebDAVModule" />
<add name="WebDAV" path="*"
 verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
 modules="WebDAVModule" resourceType="Unspecified" requireAccess="None"
 />
person vikomall    schedule 06.06.2012
comment
возиться с applicationhost.config? Неа - person Toolkit; 13.08.2014
comment
Не стоит связываться ни с чем другим, кроме файла конфигурации приложения. Во-первых, вы сделаете это для всего сервера и забудете, затем многие люди зададутся вопросом, как это работает на этой машине и не работает на остальных. Кроме того, если вам не разрешен доступ к файлу конфигурации IIS на сервере, на котором размещено приложение, вам придется решить эту проблему в файле web.config. Представьте, что на вашем сервере разработки установлено вышеуказанное обновление, будет ли ваш web.config точным? Это отличный способ потерять чей-то день на выяснение, почему производственное развертывание не удалось. - person Ivaylo Slavov; 16.05.2015

Вот как можно разрешить дополнительные HTTP-команды с помощью графического интерфейса диспетчера IIS.

  1. В диспетчере IIS выберите сайт, для которого вы хотите разрешить PUT или DELETE.

  2. Щелкните опцию «Фильтрация запросов». Щелкните вкладку «HTTP-команды».

  3. Щелкните ссылку «Разрешить глагол ...» на боковой панели.

  4. В появившемся поле введите «УДАЛИТЬ» и нажмите «ОК».

  5. Снова нажмите ссылку «Разрешить глагол ...» на боковой панели.

  6. В появившемся поле введите «PUT» и нажмите «ОК».

person Chaoix    schedule 30.01.2017
comment
хорошая попытка - что-то другое на этот раз - но все равно не сработало! - person Andrew; 28.11.2017
comment
Я пробовал все остальное, что я видел, предложенное на SO и в других местах. Я наконец попробовал это, и это сработало отлично. В моем случае глаголы PUT и DELETE уже были в списке, и мне пришлось сначала удалить их, а затем добавить обратно с помощью ссылки Allow Verb ..., но все же это сработало, когда ничего другого не было. Большое спасибо! - person JTennessen; 11.12.2017

Я использую файл ashx в приложении MVC, и ни один из приведенных выше ответов не помог мне. IIS 10.

Вот что сработало. Вместо изменения "ExtensionlessUrl-Integrated-4.0" в IIS или web.config я изменил "SimpleHandlerFactory-Integrated-4.0" на "* .ashx "файлы:

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />
person RC Cola    schedule 10.01.2019

Другой причиной может быть следующее:
Я изменил свой URL-адрес для метода Web Api в соответствии с этим ответом:

Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })

Но этот метод создает ссылку вроде:

/api/MyApiCtrl?action=MyAction

Это правильно работает с запросами GET и POST, но не с PUT или DELETE.
Я просто заменил его на:

/api/MyApiCtrl

и это устранило проблему.

person Nicolai    schedule 25.04.2014

В IIS 8.5 / Windows 2012R2 у меня ничего не упоминалось. Я не знаю, что имеется в виду под удалением WebDAV, но это не решило проблему для меня.

Мне помогли следующие шаги;

  1. Я пошел к диспетчеру IIS.
  2. В левой панели выбрал сайт.
  3. В левой рабочей области выбрал WebDAV, открыл его двойным щелчком.
  4. В самой правой панели отключил его.

Теперь все работает.

person skillworks    schedule 08.06.2017

Вы можете преобразовать свой метод Delete как POST as;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
person Teoman shipahi    schedule 16.09.2015