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
Я не уверен, что вы отредактировали правильный файл конфигурации. Попробуйте выполнить следующие шаги.
<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" />