Веб ASP.NET АПИ - ставить и удалять глаголы не разрешено - сервера IIS 8


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

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

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

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

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

18 121

18 ответов:

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

чтобы использовать команды PUT и DELETE с веб-API, вам нужно отредактировать %userprofile%\documents\iisexpress\config\applicationhost.сконфигурируйте и добавьте глаголы к Обработчик 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.конфиг.

<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" />

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

Измените Свой Веб.Конфигурационный файл, как показано ниже. Это будет действовать как очарование.

в узле <system.webServer> добавить ниже часть кода

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

после добавления, ваш веб.Конфиг будет выглядеть как ниже

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

удалить 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>

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

обновление веб.конфигурации

  <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

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

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

добавьте следующий код внутри системы.веб-тег

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

заменить вашу систему.тег веб-сервера с этим ниже кодом

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

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

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

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

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

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

1.Добавить CORS nuget package

Install-Package microsoft.aspnet.webapi.cors

2.in WebApiConfig.cs файл для регистрации метод добавить ниже код:

config.EnableCors();

пример:
использование системы.Сеть.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: "*")]

пример:

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

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

• не выбирал параметры IIS ‘WEB DAV PUBLISHING ' при установке IIS. * INETMGR - сайт по умолчанию-фильтрация запросов - HTTP глаголы-поставить как True

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

Я пошел в настройки ведения журнала IIS: > просмотр файлов журнала. В моем случае W3SVC4 была папка с последней датой, открыла папку, посмотрела последний файл журнала и увидела эту запись: Получить /отвергали за средства urlscan ~/МОЙ_ДОМЕН/АПИ/ApiName/UpdateMETHOD

метод обновления был указан с глаголом GET, странно, не так ли? Поэтому я погуглил Отклонил-по-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)

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

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

надеюсь, что это помогает.

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

  1. открыть %userprofile%\ducuments\iisexpress\config\applicationhost.конфигурации

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

<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 с помощью графического интерфейса диспетчера IIS.

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

  2. выберите опцию "фильтрация запросов". Перейдите на вкладку "команды HTTP".

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

  4. в появившемся поле Введите "удалить", нажмите кнопку ОК.

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

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

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

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

второй

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

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

enter image description here

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

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

но этот метод создает ссылку, как:

/api/MyApiCtrl?action=MyAction

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

/api/MyApiCtrl

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

вы можете конвертировать ваш метод удаления как POST as;

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

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

Что помогло мне-это ниже шагов;

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

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