ASP.NET Web API – PUT & DELETE Глаголы не разрешены – IIS 8

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

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

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

Я пробовал редактировать разделы WebDav из applicationhost.config, но это не помогло. Например, я удалил из файла конфигурации .

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

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

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

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

      

    чтобы:

      

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

        

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

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

    В узле добавьте ниже часть кода

        

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

                          

    Удалить WebDAV отлично работает для моего случая:

             

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

    Обновите свой web.config

                

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

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

    В веб-интерфейсе Asp.Net – webconfig. Это работает во всех браузерах.

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

           

    Замените тэг system.webserver этим ниже кодом

                        

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

              

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

             

    Включить 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. Добавьте следующий код в пространство имен controllerа: get, post, delete, put или любой метод http

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

    например:

     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 GET() { return DevTestBLL.GetRestaurant(); } public List DELETE(int id) { return DevTestBLL.DeleteRestaurant(id); } } } 

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

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

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

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

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

    Метод Update был указан с глаголом GET, странно? Итак, я googled для отклоненного-UrlScan и нашел эту ссылку: UrlScan Broke My Blog .

    Я пошел сюда:% 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) 

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

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

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

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

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

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

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

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

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

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

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

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

    Пример:

     DELETE http://localhost/item/1 

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

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

    1. открыть% userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config

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

       
      

    Вот как вы разрешаете дополнительные HTTP-глаголы, используя графический интерфейс IIS Manager.

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

    2. Нажмите кнопку «Фильтрация запросов». Перейдите на вкладку «HTTP-глаголы».

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

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

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

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

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

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

    второй

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

    если это будет сделано, перезапустите IIS-сервер, это будет нормально

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

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

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

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

     /api/MyApiCtrl?action=MyAction 

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

     /api/MyApiCtrl 

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

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

      [HttpPost] public void Delete(YourDomainModel itemToDelete) { } 

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

    Что помогло мне, это следующие шаги;

    1. Я пошел в диспетчер IIS.
    2. На левой панели выбран сайт.
    3. В левой рабочей области выбран WebDAV, дважды нажмите кнопку «Открыть».
    4. В правой части панели отключено.

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

    Давайте будем гением компьютера.