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'.

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

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

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

Ответ 1

Хорошо. Наконец я дошел до конца. Вам нужно проскользнуть через несколько обручей, чтобы правильные команды PUT и DELETE корректно работали с IIS8. Фактически, если вы установите кандидат на выпуск VS 2012 и создаете новый проект API WEB, вы обнаружите, что образцы 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" />

в

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

В дополнение к вышесказанному вы должны убедиться, что WebDAV не мешает вашим запросам. Это можно сделать, комментируя следующие строки из приложенияhost.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" />

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

Ответ 2

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

Ответ 3

Удалить 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 получателю, это не произойдет, если приложение, размещенное на другой машине

Ответ 4

Обновите свой 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

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

Ответ 5

В веб-интерфейсе Asp.Net - 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>

Ответ 6

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

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>

Ответ 7

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

Ответ 8

Включить 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

Ответ 9

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

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

Ответ 10

После бесконечного поиска и тестирования уже предоставленных ответов (добавление глаголов 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)

Ответ 11

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

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

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

Ответ 12

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

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

Ответ 13

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

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

  • По умолчанию приведенные записи комментируются в файле 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"
 />

Ответ 14

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

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

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

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

  • В появившемся поле введите "DELETE", нажмите "ОК".

  • Еще раз нажмите ссылку "Разрешить..." на боковой панели.

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

Ответ 15

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

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

второй

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

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

enter image description here

Ответ 16

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

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

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

/api/MyApiCtrl?action=MyAction

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

/api/MyApiCtrl

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

Ответ 17

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

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

Ответ 18

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

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

  • Я пошел в диспетчер IIS.
  • На левой панели выбран сайт.
  • В левой рабочей области выбран WebDAV, дважды щелкните его дважды.
  • В правой части панели отключено.

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

Ответ 19

Я использую файл 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" />