Веб 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 ответов:
- ладно. Я наконец-то докопался до сути. Вам нужно прыгать через некоторые обручи, чтобы получить положить и удалить глаголы, работающие правильно с 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>
устраняет необходимость изменения конфигурации хоста.
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, это было просто:
- открыть IIS
- перейти к сопоставлениям обработчиков
- нажмите кнопку Изменить на php5. 6.X или php7.0.x
- нажмите кнопку "запрос ограничения"
- на вкладке глаголы выберите "один из следующих глаголов" и добавьте "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
надеюсь, что это помогает.
Я не уверен, что вы отредактировали правильный файл конфигурации. Попробуйте выполнить следующие действия
открыть %userprofile%\ducuments\iisexpress\config\applicationhost.конфигурации
по умолчанию ниже данные записи комментируются в 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.
в Диспетчере IIS выберите сайт, для которого вы хотите разрешить PUT или DELETE.
выберите опцию "фильтрация запросов". Перейдите на вкладку "команды HTTP".
Нажмите кнопку " Разрешить глагол..."ссылка в боковой панели.
в появившемся поле Введите "удалить", нажмите кнопку ОК.
Нажмите кнопку " Разрешить глагол..." ссылке в боковом меню.
в появившемся поле Введите "PUT", нажмите кнопку ОК.
я столкнулся с той же проблемой с вами, а затем решил ее, Вот решения, я хочу, чтобы это, возможно, может помочь
Первыйв IIS
modules
конфигурация, цикл до WebDAVModule, если ваш веб-сервер имеет его, то удалите еговторой
в IIS
handler mappings
конфигурация, вы можете увидеть список включения обработчика, чтобы выбратьthe PHP item
, отредактируйте его, на странице редактирования нажмите кнопку Запросить ограничения, затем выберитеthe verbs tab
в модальном, в укажите глаголы, которые будут обрабатывать метку, проверьтеall verbs radio
, затем нажмите кнопку ОК, вы также можете увидеть предупреждение, оно показывает нам, что использовать двойные кавычки для выполнения PHP-CGI, а затем сделать этоесли это сделано, то перезагрузите сервер IIS, это будет нормально
другая причина может быть следующей:
Я изменил свой 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, но это не решило проблему для меня.
Что помогло мне-это ниже шагов;
- я пошел в диспетчер IIS.
- в левой панели выбранного сайта.
- в левой рабочей области выделил WebDAV, открыл его двойным щелчком.
- в правой панели, отключил его.
теперь все работает.